值方法和指针方法
值对象可以调用值方法&指针方法
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()) }