go中interface的实现类型之值传递

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接口,指针实现了接口,而不是结构体实现了接口,通过指针方法,操作指针,改变指针内的数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值