函數(shù)的入?yún)⑹悄硞€(gè)interface,那么函數(shù)里調(diào)用interface里的方法時(shí),如果方法里有修改結(jié)構(gòu)體變量风科,會(huì)修改原有的變量么撒轮?
1.方法的接收器是指針,結(jié)構(gòu)體的成員變量是指針變量贼穆。變量被修改了题山。
2.方法的接收器是指針,結(jié)構(gòu)體的成員變量不是指針變量故痊。變量被修改了顶瞳。
3.方法的接收器不是指針,結(jié)構(gòu)體的成員變量不是指針變量愕秫。變量沒(méi)有被修改了慨菱。
4.方法的接收器不是指針,結(jié)構(gòu)體的成員變量是指針變量戴甩。變量被修改了符喝。
也就是方法的接收器或者成員變量有一方是指針,那么原來(lái)結(jié)構(gòu)體的成員變量就會(huì)被修改甜孤。
package main
import "fmt"
type Reader interface {
Read() int
}
type MyStruct struct {
X, Y *int
}
func (m *MyStruct) Read() int {
res := *m.X + *m.Y
*m.X ++
*m.Y ++
return res
}
type MyStruct2 struct {
X, Y int
}
func (m *MyStruct2) Read() int {
res := m.X + m.Y
m.X++
m.Y++
return res
}
type MyStruct3 struct {
X, Y int
}
func (m MyStruct3) Read() int {
res := m.X + m.Y
m.X++
m.Y++
return res
}
type MyStruct4 struct {
X, Y *int
}
func (m MyStruct4) Read() int {
res := *m.X + *m.Y
*m.X ++
*m.Y ++
return res
}
func run(r Reader) {
fmt.Println(r.Read())
}
func main() {
// 函數(shù)的入?yún)⑹悄硞€(gè)interface协饲,那么函數(shù)里調(diào)用interface里的方法時(shí),如果方法里有修改結(jié)構(gòu)體變量缴川,會(huì)修改原有的變量么茉稠?
// 1.方法的接收器是指針,結(jié)構(gòu)體的成員變量是指針變量把夸。變量被修改了战惊。
x, y := 3, 4
s := &MyStruct{&x, &y}
run(s)
fmt.Printf("1. x:%v,y:%v\n", *s.X, *s.Y)
// 2.方法的接收器是指針,結(jié)構(gòu)體的成員變量不是指針變量扎即。變量被修改了吞获。
s2 := &MyStruct2{3, 4}
run(s2)
fmt.Printf("2. x:%v,y:%v\n", s2.X, s2.Y)
// 3.方法的接收器不是指針,結(jié)構(gòu)體的成員變量不是指針變量谚鄙。變量沒(méi)有被修改了各拷。
s3 := &MyStruct3{3, 4}
run(s3)
fmt.Printf("3. x:%v,y:%v\n", s3.X, s3.Y)
// 4.方法的接收器不是指針,結(jié)構(gòu)體的成員變量是指針變量闷营。變量被修改了烤黍。
x1, y1 := 3, 4
s4 := MyStruct4{&x1, &y1}
run(s4)
fmt.Printf("4. x:%v,y:%v\n", *s4.X, *s4.Y)
}
/**
output:
7
1. x:4,y:5
7
2. x:4,y:5
7
3. x:3,y:4
7
4. x:4,y:5
*/