```
const result = "Polar radius =%.02f θ=%.02f° →Cartesian x = %.02f y =%.02f\n"
func interact(questions chan polar, answers chan cartesian) {
reader := bufio.NewReader(os.Stdin)
fmt.Println(prompt)
for{
fmt.Println("Radius and angle:")
line, err:= reader.ReadString('\n')
if err != nil{
break
}
var radius,θ float64
if _,err:= fmt.Sscan(line, "%f %f ",&radius,&θ); err != nil {
fmt.Println(os.Stderr, "invalid input")
fmt.Println("err=",err)
continue
}
questions <-polar{radius,θ}
coord := <-answers
fmt.Println(result, radius,θ,coord.x,coord.y )
}
fmt.Println()
}
```
编译执行时,在如下代码报错:
var radius,θ float64
if _,err:= fmt.Sscan(line, "%f %f ",&radius,&θ); err != nil {
fmt.Println(os.Stderr, "invalid input")
fmt.Println("err=",err)
continue
}
错误信息:
```
&{0xc42000a3a0} invalid input
err= type not a pointer: string
Radius and angle:
```
请大神指点
遇到问题先查文档是一个好习惯。仔细看看 go doc 对 fmt.Sscan 是怎么描述的:
> func Sscan(str string, a ...interface{}) (n int, err error)<br>
> Sscan scans the argument string, storing successive space-separated values
into successive arguments. Newlines count as space. It returns the number of
items successfully scanned. If that is less than the number of arguments,
err will report why.
在编译器看来,下面的语句表示:将 line 中(用空白分割的)第一个 token 赋给 "%f %f",(后面省略)。
```
if _,err:= fmt.Sscan(line, "%f %f ",&radius,&θ); err != nil {
```
"%f %f"是一个字符串常量,而不是变量的指针,运行时无法给它赋值。因此报下面的错:
```
type not a pointer: string
```
意思是我想要一个指针,你却给我了一个字符串。我只能给你一个 panic 。
#4
更多评论
新手也需要好好提问:
1. 代码不完整;
2. 格式乱,markdown 基本语法得懂点,即使不懂,发布那里有教程,还提示了发布前预览下;
3. 节点也不好好选;
#2