猿问

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

我不明白为什么指针s是nil即使在input()方法初始化它。任何的想法?


package main


import "fmt"



type ps string


func(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


不负相思意
浏览 180回答 2
2回答

HUX布斯

v 值 (0) 被传递到 v.input。传递的值存储在局部变量 s 中。s 值被修改。没有人将新的 s 值保存回 v 中。如果您想在函数中修改某些内容,则必须传递指向该值的指针。(或切片、贴图等的参考)。如果你想改变指针值,你应该将指针传递给你的指针。

烙印99

您需要两个things--main需要的分配空间ps是input可以写进去,您可以通过更换做var v *ps用v := new(ps)。该字符串会"",但它并不不管它是什么,只是说有空间,在内存中设置了一个串标头是input可以写入。正如 Momer 所说,否则指针nil和您的程序会在试图取消引用它时发生恐慌。并且为了通过指针赋值,input需要使用*s = x. 由于*s非正式地是“获取s指向的内容”,因此您可以将其理解为“更改s指向的内容x”。通常,点运算符和方法调用周围的自动 ref/deref 行为使您免于这样做,但是当您通过指针类型分配或执行其他操作(算术、索引等)时,代码中需要取消引用。
随时随地看视频慕课网APP

相关分类

Go
我要回答