「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」。
0 环境
- 系统环境:win10
- 编辑器:vscode
- go版本:gol.17.3
- 参考文章:go语言中文文档
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()
}
3 参数修改
想修改原值的,&该值地址变量,
*地址变量 = 新值即可。
4 小结
调用的方法(如上
printStr)参数是接口变量,可以用具体类型传参给该方法,请忘记用指向接口的指针,因为法律不允许,你这样做就是违法。参数修改,从结果来看就是把原值改了,可以用指针,用电视剧里的片段,就是我要当真正的武林盟主,而不是你的傀儡。