函數(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)體的成員變量不是指針變量。變量沒有被修改了。
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)體的成員變量不是指針變量。變量沒有被修改了。
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
*/