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
}