为了账号安全,请及时绑定邮箱和手机立即绑定

为什么指针在这个 Go 程序中失去了它的价值

为什么指针在这个 Go 程序中失去了它的价值

Go
不负相思意 2021-09-09 20:21:46
我不明白为什么指针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 中。

如果您想在函数中修改某些内容,则必须传递指向该值的指针。(或切片、贴图等的参考)。

如果你想改变指针值,你应该将指针传递给你的指针。



查看完整回答
反对 回复 2021-09-09
?
烙印99

TA贡献1829条经验 获得超13个赞

您需要两个things--main需要的分配空间psinput可以写进去,您可以通过更换做var v *psv := new(ps)。该字符串会"",但它并不不管它是什么,只是说有空间,在内存中设置了一个串标头input可以写入。正如 Momer 所说,否则指针nil和您的程序会在试图取消引用它时发生恐慌。

并且为了通过指针赋值,input需要使用*s = x. 由于*s非正式地是“获取s指向的内容”,因此您可以将其理解为“更改s指向的内容x”。通常,点运算符和方法调用周围的自动 ref/deref 行为使您免于这样做,但是当您通过指针类型分配或执行其他操作(算术、索引等)时,代码中需要取消引用。


查看完整回答
反对 回复 2021-09-09
  • 2 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信