从方法或函数中将指针设置为 nil

为什么这两个destroy函数都不会将指针更改为 nil,我该如何创建这样的函数?


package main


import (

    "fmt"

)


type position struct {

    x int

    y int

}


func (p *position) destroy() {

    p = nil

}


func destroy(p *position) {

    p = nil

}


func main() {

    p1 := &position{1,1}

    p2 := &position{2,2}

    p1.destroy()

    destroy(p2)


    if p1 == nil {

        fmt.Println("p1 == nil")

    } else {

        fmt.Println(p1)

    }


    if p2 == nil {

        fmt.Println("p2 == nil")

    } else {

        fmt.Println(p2)

    }


}

输出:


&{1 1}

&{2 2}

https://play.golang.org/p/BmZjX1Hw24u


红糖糍粑
浏览 93回答 1
1回答

富国沪深

您需要一个指向指针的指针来更改指针的值。这是您的代码示例,已修改为执行此操作 ( playground ):package mainimport (    "fmt")type position struct {    x int    y int}func destroy(p **position) {    *p = nil}func main() {    p1 := &position{1, 1}    destroy(&p1)    if p1 == nil {        fmt.Println("p1 == nil")    } else {        fmt.Println(p1)    }}在您当前的代码中func destroy(p *position) {    p = nil}在里面destroy,p是一个保存结构地址的值position。通过给p自己分配一些东西,你只是让它保存一些其他position结构(或nil)的地址。您没有修改传入的原始指针。这与尝试通过分配给它来修改其参数的函数没有什么不同:// This will not actually modify the argument passed in by the callerfunc setto2(value int) {  value = 2}go 规范在关于调用和调用参数的部分中说:在对它们求值后,调用的参数按值传递给函数,被调用的函数开始执行。函数的返回参数在函数返回时按值传递回调用函数。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go