【golang】结构体方法和“以接口为参数的函数”的调用规则尝试

以下是我的初步尝试,有错误的话望指出

package main

import "fmt"

// 定义一个结构
type Person struct {
	name string
}

// 写四个方法
func (P Person) Sayname() {
	fmt.Println("sayname", P.name)
}
func (P *Person) Sayname1() {
	fmt.Println("sayname1", P.name)
}

// 更改方法
func (P Person) Changename() {
	// 实际上这个函数本身就会报错
	P.name = "anc"
}
func (P *Person) Changename1() {
	P.name = "wyw"
}

// 定义三个接口,每个接口内的方法,参数都不同
type Persondo1 interface {
	Sayname()
}
type Persondo2 interface {
	Sayname1()
}
type Persondo3 interface {
	Changename1()
}

// 定义混合接口
type Persondo4 interface {
	Sayname()
	Sayname1()
	Changename1()
}

// 定义接口相关的函数
func fn1(p Persondo1) {
	p.Sayname()
}

func fn2(p Persondo2) {
	p.Sayname1()
}

func fn3(p Persondo3) {
	p.Changename1()
}
func fn4(p Persondo4) {
	p.Sayname()
}

func main() {
	me := Person{"huangfe"}
	me1 := &me
	me.Sayname()
	me1.Sayname()
	// 本身和指针都能调用 本身作为参数的 读取属性方法
	fmt.Println("----------")
	me.Sayname1()
	me1.Sayname1()

	// 本身和指针都能调用 指针作为参数的 读取属性方法
	fmt.Println("----------")
	me.Changename()
	fmt.Println(me.name)
	// 本身能调用 本身作为参数的 改变属性方法 但属性不改变
	fmt.Println("----------")
	me1.Changename()
	fmt.Println(me.name)
	// 指针能调用本身作为参数的 改变属性方法 但属性不改变
	fmt.Println("----------")
	me.Changename1()
	fmt.Println(me.name)
	// 本身能调用 指针作为参数的 改变属性方法 属性改变
	fmt.Println("----------")
	me1.Changename1()
	fmt.Println(me.name)
	// 指针能调用 指针作为参数的 改变属性方法 属性改变
	fmt.Println("----------")

	// 测试接口的调用
	// 创建新实例
	you := Person{"lyf"}
	you1 := &you
	// fn1实现的Persondo1接口,包含一个参数是结构体实例本身的方法
	fn1(you1)
	fn1(you)
	// 结果结构体实例和指针都能作为参数
	fmt.Println("----------")
	//fn2函数实现的是Persondo2的接口,包含的是Sayname1()方法,该方法以指针为参数
	fn2(you1)
	// fn2(you)  结构体实例不能作为参数
	fmt.Println("----------")
	//fn3实现的是Persondo3接口,包含的是Changename1()方法,该方法以指针为参数
	// fn3(you) //结构体实例不能作为参数
	fn3(you1)
	fmt.Println(you) //成功改变实例
	fmt.Println("----------")
	// fn4函数实现的是混合接口,包含三个方法,方法参数有指针,也有结构体实例
	fn4(you1)
	// fn4(you) 因为是混合接口的原因,结构体实例不能作为参数

	// 规则总结
	// 结构体本身和指针都能调用方法,但是如果需要结构体实例本身改变,那么参数必须为指针
	// 以接口为参数的函数fn,如果接口内部有“以结构体指针为参数的方法”,那么fn的参数必须是结构体指针以实现兼容

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值