为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
红糖糍粑 2023-06-05 19:40:13
为什么这两个destroy函数都不会将指针更改为 nil,我该如何创建这样的函数?package mainimport (    "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
查看完整描述

1 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

您需要一个指向指针的指针来更改指针的值。

这是您的代码示例,已修改为执行此操作 ( playground ):

package main


import (

    "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 caller

func setto2(value int) {

  value = 2

}

go 规范在关于调用和调用参数的部分中说:

在对它们求值后,调用的参数按值传递给函数,被调用的函数开始执行。函数的返回参数在函数返回时按值传递回调用函数。


查看完整回答
反对 回复 2023-06-05
  • 1 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信