1 func(recv recevier_type)methodName(parameter_list)(return_value_list){} 数组
方法名以前,func关键字以后的括号中指定接受者(receiver)。函数
若是recv是接受者(receiver)的实例,Method1是recv的方法名,那么方法的调用遵循传统的object.name选择器符号:recv.Method1()。假如recv是一个指针,Go会自动解引用。spa
1 package main 2 3 import "fmt" 4 5 type TwoInts struct { 6 a int 7 b int 8 } 9 func(ti *TwoInts)Add()int{ 10 return ti.a + ti.b 11 } 12 13 func(ti *TwoInts)Plus()(re int){ 14 re = ti.a * ti.b 15 return 16 } 17 18 func(ti *TwoInts)AddOther(param int)(re int){ 19 re = ti.a + ti.b +param 20 return 21 } 22 // 结构体上的例子 23 func main(){ 24 tt := new(TwoInts) 25 tt.a = 10 26 tt.b = 20 27 28 fmt.Println(tt.Add()) 29 fmt.Println(tt.Plus()) 30 31 ttt := TwoInts{3,5} 32 fmt.Println(ttt.AddOther(7)) 33 }
package main import "fmt" type IntVetor []int func (iv IntVetor) Sum(param int) (re int) { su := 0 for _, v := range iv { su = su + v } re = su + param return } // 非结构体上的例子 func main() { tv := IntVetor{3,4,5} fmt.Println(tv.Sum(333)) }
若是想给基本类型添加方法,通常是行不通的,由于基本类型和你添加方法的包不是同一个,会出现编译错误。指针
总结:指针方法和值方法均可以在指针或者非指针上被调用。也就是说,方法接收者是指针类型时,指针类型的值也是调用这个方法,反之亦然。code
当一个匿名类型被内嵌在结构体中时,匿名类型的可见方法也一样被内嵌,这在效果上等同于外层类型继承了这些方法,将父类型放在子类型中实现(子类型中的方法,能够直接使用父类型加点子类型方法的方式调用[father.childMethod()])对象
可是当父类型和子类类型有相同名字的方法怎么办呢?父类型的方法会覆盖子类型的。blog
1 package main 2 3 import "fmt" 4 5 type Child struct { 6 a, b int 7 Father// 【重点】这里必须是匿名类型才能够实现继承的效果,不然不能够!!!!!! 8 } 9 type Father struct { 10 name string 11 } 12 13 func (fa *Father) GetName() (re string) { 14 re = chi.name 15 return 16 } 17 18 func main() { 19 c := Child{1, 3, Father{"Kobe"}} 20 fmt.Println(c.GetName()) 21 }