GO-方法的接收者是值或者指针

GO 语言自己比较智能(对传递参数能够自动识别,转换,对于接口就会有编译错误)。 接口的理论:传过去【赋值】的对象必须实现了接口要求的方法,而t1没有实现M2(),t1的指针实现了M2() 先声明一个结构体: type T struct {
    Name string
} func (t T) M1() {
    t.Name = "name1"
} func (t *T) M2() {
    t.Name = "name2"
} type Intf interface {
    M1()
    M2()
} M1() 的接收者是值类型 T, M2() 的接收者是值类型 *T , 两个方法内都是改变Name值。 下面声明一个 T 类型的变量,并调用 M1() 和 M2() 。     t1 := T{"t1"}     fmt.Println("M1调用前:", t1.Name)
    t1.M1()
    fmt.Println("M1调用后:", t1.Name)     fmt.Println("M2调用前:", t1.Name)
    t1.M2()
    fmt.Println("M2调用后:", t1.Name) 输出结果为: M1调用前: t1
M1调用后: t1
M2调用前: t1
M2调用后: name2 下面声明一个 *T 类型的变量,并调用 M1() 和 M2() 。     t2 := &T{"t2"}     fmt.Println("M1调用前:", t2.Name)
    t2.M1()
    fmt.Println("M1调用后:", t2.Name)     fmt.Println("M2调用前:", t2.Name)
    t2.M2()
    fmt.Println("M2调用后:", t2.Name) 输出结果为: M1调用前: t2
M1调用后: t2
M2调用前: t2
M2调用后: name2

猜你喜欢

转载自mojianpo.iteye.com/blog/2313979