即使在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")
}
}
答案 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。
如果要在函数中修改某些内容,则必须将指针传递给该值。 (或切片,地图等的参考)。
如果要更改指针值,则应将指针传递给指针。
亚历