go语言参数传递:值及指针之间的选择 笔记

187 阅读2分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」。

0 环境

2 再探指针

如下面的代码案例:我在structShow函数中,定义了一个值类型变量:address,该值类型变量address和它的指针&address都可以被当作参数传递给函数printStr,代码正常运行,并且都可以输出结果,这也说明接收者是值类型时,它实现了某个接口后,它的指针类型也可以实现接口。换言之:值类型作为接收者时,不管是值类型,还是指针类型都可以实现该接口。现在我们再把指针指向接口,观察它是否可以,还是调用之前函数和变量,我们把指针放在函数的前面,如:sip1 := &printStr(address),这样是不可以的。这样不行,那printStr它的参数是是个接口变量呢,之前结构体变量传参给接口变量可以,那我要是实现了接口变量在传参呢,比如取地址,指向接口指针可以不(比如新建var address1 实现接口 = 初始化结构体),在调用呢printStr(&address1),其实也是不可以的,会错:xxxxx is pointer to interface, not interface。也就说:可以实现接口的情况:指向具体的类型的指针。不能实现接口的情况:指向接口的指针,请忘记指向接口的指针,就当这事没有发生过。

type users struct {
   id        uint
   usersName string
   addr      addr
}

type addr struct {
   city string
}

type Stringser interface {
   show() string
}

func (u *users) show() string {
   fmt.Println("the usersname is -->", u.usersName, " |id is -->", u.id)
   return "ok"
}

func (addr addr) show() string {
   fmt.Println("the addr is -->", addr.city)
   return "ok"
}

func printStr(u Stringser) string {
   //fmt.Println(u.show())
   return u.show()
}

func structShow() {
   //u := users{usersName: "小明", id: 1, addr: addr{
   // city: "美国",
   //}}

   address := addr{city: "美国"}

   printStr(address)
   fmt.Println("-------------------1-----------------------")
   printStr(&address)
   //printStr(&u)
   fmt.Println("-------------------2-----------------------")
   sip := printStr(address)
   fmt.Println(sip)
   fmt.Println("-------------------3-----------------------")
   sip1 := &printStr(address)
   fmt.Println(sip1)
   fmt.Println("-------------------4-----------------------")

}

func main() {
   structShow()
}

image.png

image.png

3 参数修改

想修改原值的,&该值地址变量,*地址变量 = 新值即可。

4 小结

调用的方法(如上printStr)参数是接口变量,可以用具体类型传参给该方法,请忘记用指向接口的指针,因为法律不允许,你这样做就是违法。参数修改,从结果来看就是把原值改了,可以用指针,用电视剧里的片段,就是我要当真正的武林盟主,而不是你的傀儡。