难理解的点---值方法和指针方法 + 接口赋值

值方法和指针方法

值对象可以调用值方法&指针方法

type Person struct{
	Name string 
	Age int 
}

// 值方法
func(p Person) SayHello(){
	fmt.Printf("Hello, my name is %s
", p.Name)
}
// 引用方法
func(p *Person) SetAge(age int){
	p.Age = age
}

func main(){
	var jack = Person{"jack", 10}
	jack.SayHello()
	jack.SetAge(20)
	fmt.Println(jack.Age)  // 20
}

很明显,值类型肯定可以调用值方法,而对于指针方法的调用,其实是golang的语法糖,调用的时候jack.SetAge,会自动转换成(&jack).SetAge

指针对象可以调用值方法&指针方法

type Person struct{
	Name string 
	Age int 
}
// 值方法
func(p Person) SayHello(){
	fmt.Printf("Hello, my name is %s
", p.Name)
}
// 引用方法
func(p *Person) SetAge(age int){
	p.Age = age
}

func main(){
	var jack = &Person{"jack", 10}
	jack.SayHello()
	jack.SetAge(20)
	fmt.Println(jack.Age)  // 20
}

指针对象调用值方法也是golang中的语法糖,在调用值方法jack.SayHello的时候,会自动转换成(*jack).SayHello

接口赋值

如果我们调用一个接口里面的函数,结构体对象实现接口时的方法可能是指针方法也可以是值方法,那么需要注意:

  • 值类型只能调用值方法

  • 指针类型可以调用值方法和指针方法

  • 不确定怎么赋值就用指针类型赋值
package main 

import (
	"fmt"
)

// 接口类型
type Human interface{
	SayHello()
	SetAge(age int)
	GetAge()int 
}

// 结构体对象
type Person struct{
	Name string 
	Age int 
}

// 值方法
func(p Person) SayHello(){
	fmt.Printf("Hello, my name is %s
", p.Name)
}

// 指针方法
func(p *Person) SetAge(age int){
	p.Age = age
}

// 值方法
func(p Person)GetAge()int{
	return p.Age
}

func main(){
	// jack是个接口,被一个指针对象赋值,下面的方法都可以正确执行
	var jack Human  
	jack = &Person{"jack", 10} 
	jack.SayHello() 
	jack.SetAge(20)
	fmt.Println(jack.GetAge())

	// 值类型并没有实现SetAge的方法,所以赋值的时候会报错
	var Tom Human 
	Tom = Person{"Tom", 12}
	Tom.SayHello()
	Tom.SetAge(10)
	fmt.Println(Tom.GetAge())
}
原文地址:https://www.cnblogs.com/chusiyong/p/14439689.html