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

时间:2014-12-08 00:45:15

标签: go

即使在s方法初始化之后,我也不明白为什么指针nilinput()。有什么想法吗?

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

2 个答案:

答案 0 :(得分:1)

您需要两件事 - main需要为ps可以写入的input分配空间,您可以将var v *ps替换为{{1} }}。该字符串将为v := new(ps),但它无关紧要,只是在内存中为"" input可以写入的string header留出空间。正如Momer所说,otherwise the pointer's nil和你的程序恐慌,试图取消引用它。

为了通过指针分配,input需要使用*s = x。由于*s非正式地“获取s指向的内容”,因此您可以将其视为“将s指向x更改为{{1}}”。通常,点运算符和方法调用周围的自动ref / deref行为可以保存您,但是当您通过指针类型分配或执行其他操作(算术,索引等)时,需要在代码中存在取消引用。 / p>

答案 1 :(得分:0)

v value(0)传递给v.input。传递的值存储在局部变量s中。 s值被修改。没有人将新的价值保存回v。

如果要在函数中修改某些内容,则必须将指针传递给该值。 (或切片,地图等的参考)。

如果要更改指针值,则应将指针传递给指针。

亚历