package main
import "fmt"
type iread interface {
mread() string
}
type iwrite interface {
mwrite(path string)
}
type irw interface {
iread
iwrite
}
type file struct {
path string
}
func (f file) mread() string {
return f.path
}
func (f file) mwrite(path string) {
f.path = path
}
type file2 struct {
path string
}
func (f *file2) mread() string {
return f.path
}
func (f *file2) mwrite(path string) {
f.path = path
}
func change(rw irw) {
rw.mwrite("/root/")
fmt.Println(rw)
}
func main() {
var rw irw
file := file{path: "/home/"}
rw = file
fmt.Println("改变前:", rw)
change(rw)
fmt.Println("改变后1:", rw)
rw = &file //line 49
change(rw)
fmt.Println("改变后2", rw)
fmt.Println("=========测试filer==================")
file2 := file2{path: "/home/"}
rw = &file2
fmt.Println("改变前:", rw)
change(rw)
fmt.Println("改变后1:", rw)
}
//===============执行结果=============
/*
改变前: {/home/}
{/home/}
改变后1: {/home/}
&{/home/}
改变后2 &{/home/}
=========测试filer==================
改变前: &{/home/}
&{/root/}
改变后1: &{/root/}
Process finished with exit code 08
*/
分析:1.结构体 调用方法是值传递,即复制了一份 file 然后执行 write方法;方法的调用者本质也是一个传递过来的参数,只是位置不同罢了,位于了方法名之前。
2.line 49只是 虽然取file的地址,但是编译器会从地址取出来file变量,复制一份给 change桢。故还是值传递。
3.测试file2的结果表明,file2变量的指针实现了irw接口,指针实现了接口,而不是结构体实现了接口,通过指针方法,操作指针,改变指针内的数据。