Pointers 通过函数将指针设置为nil
有一个函数可以设置指向Pointers 通过函数将指针设置为nil,pointers,go,null,Pointers,Go,Null,有一个函数可以设置指向nil值的指针: func nilSetter(x *int) { x = nil } 我有这样一段代码: i := 42 fmt.Println(&i) nilSetter(&i) fmt.Println(&i) 其中打印: 0xc42008a000 0xc42008a000 我希望: 0xc42008a000 nil 我知道之所以会发生这种情况,是因为函数nilSetter只是复制地址并将该副本设置为nil 但是我怎样才能正确地做
nil
值的指针:
func nilSetter(x *int) {
x = nil
}
我有这样一段代码:
i := 42
fmt.Println(&i)
nilSetter(&i)
fmt.Println(&i)
其中打印:
0xc42008a000
0xc42008a000
我希望:
0xc42008a000
nil
我知道之所以会发生这种情况,是因为函数nilSetter
只是复制地址并将该副本设置为nil
但是我怎样才能正确地做呢 实现这一点的唯一方法是使用指向指针的指针。而且它相当笨重,所以可能不是你想要的:
func nilSetter(x **int) {
*x = nil
}
func main() {
x := 2
xp := &x
fmt.Println(xp)
nilSetter(&xp)
fmt.Println(xp)
}
// Output:
// 0x10414020
// <nil>
func nilSetter(x**int){
*x=零
}
func main(){
x:=2
xp:=&x
fmt.Println(xp)
nilSetter(&xp)
fmt.Println(xp)
}
//输出:
//0x10414020
//
这种行为的原因是因为Go中没有传递引用
两个变量可以包含指向同一存储位置的内容。但是,不可能让它们共享同一存储位置。
例如:
从您的代码中,nilSetter
的参数x
指向某个位置,但它有自己的地址,当您为它设置nil
时,您更改的是它的地址,而不是它所指向的地址
package main
import "fmt"
func nilSetter(x *int) {
x = nil
fmt.Println(x, &x) // <nil> 0x1040c140
}
func main() {
i := 42
fmt.Println(&i) // 0x10414020
nilSetter(&i)
fmt.Println(&i) // 0x10414020
}
主程序包
输入“fmt”
func nilSetter(x*int){
x=零
fmt.Println(x,&x)//0x1040c140
}
func main(){
i:=42
fmt.Println(&i)//0x10414020
尼尔塞特(i&i)
fmt.Println(&i)//0x10414020
}
这就是为什么指针总是有一个精确的地址,即使它的值是nil
引用Dave Cheney的一篇博文:只需使用返回值和赋值
func nilSetter(x*int)*int{
x=零
返回x
}
x=nilSetter(x)
你应该fmt.Println(&x)
而不是fmt.Println(&xp)
@KenenbekArzymatov请参考@maksadbek的答案。在Go中无法更改&x
的值。
package main
import "fmt"
func nilSetter(x *int) {
x = nil
fmt.Println(x, &x) // <nil> 0x1040c140
}
func main() {
i := 42
fmt.Println(&i) // 0x10414020
nilSetter(&i)
fmt.Println(&i) // 0x10414020
}