我不明白为什么指针s是nil即使在input()方法初始化它。任何的想法?package mainimport "fmt"type ps stringfunc(s *ps)input(){ x := ps("a") s = &x}func(s *ps)output(){}func main() { var v *ps v.input() if v == nil{ fmt.Println("v shouldn't be nil") }}游乐场http://play.golang.org/p/jU2hoMP7TS
2 回答
HUX布斯
TA贡献1876条经验 获得超6个赞
v 值 (0) 被传递到 v.input。传递的值存储在局部变量 s 中。s 值被修改。没有人将新的 s 值保存回 v 中。
如果您想在函数中修改某些内容,则必须传递指向该值的指针。(或切片、贴图等的参考)。
如果你想改变指针值,你应该将指针传递给你的指针。
烙印99
TA贡献1829条经验 获得超13个赞
您需要两个things--main
需要的分配空间ps
是input
可以写进去,您可以通过更换做var v *ps
用v := new(ps)
。该字符串会""
,但它并不不管它是什么,只是说有空间,在内存中设置了一个串标头是input
可以写入。正如 Momer 所说,否则指针nil
和您的程序会在试图取消引用它时发生恐慌。
并且为了通过指针赋值,input
需要使用*s = x
. 由于*s
非正式地是“获取s
指向的内容”,因此您可以将其理解为“更改s
指向的内容x
”。通常,点运算符和方法调用周围的自动 ref/deref 行为使您免于这样做,但是当您通过指针类型分配或执行其他操作(算术、索引等)时,代码中需要取消引用。
- 2 回答
- 0 关注
- 179 浏览
添加回答
举报
0/150
提交
取消