以下是我的初步尝试,有错误的话望指出
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的参数必须是结构体指针以实现兼容
}