我不明白为什么指针 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")
}
}
Playground http://play.golang.org/p/jU2hoMP7TS
最佳答案
你需要做两件事——main
需要为 input
可以写入的 ps
分配空间,你可以通过替换var v *ps
和 v := new(ps)
。该字符串将是 ""
,但它是什么并不重要,只要在内存中为 string header 留出空间即可。 input
可以写入。正如 Momer 所说,otherwise the pointer's nil
并且您的程序在尝试取消引用它时会发生 panic 。
为了通过指针赋值,input
需要使用*s = x
。由于 *s
是非正式的“获取 s
指向的内容”,您可以将其理解为“将 s
指向的内容更改为 x
”。通常,围绕点运算符和方法调用的自动引用/取消引用行为可以避免这种情况,但是当您通过指针类型分配或执行其他操作(算术、索引等)时,代码中需要取消引用。
关于go - 为什么指针在这个 Go 程序中失去了它的值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27349731/