Go/面向物件特性/方法-封裝
阿新 • • 發佈:2018-11-17
# 可以為任意自定義型別(結構體、基礎資料型別)繫結方法,但不包括指標型別
# func (t T) f(paras) (rets) //接收者 引數 返回值
# 方法總是繫結物件例項t,並隱式地將例項t作為第一實參
# 方法中若不使用t,可以省略
# t的型別可以是T或*T,但T不能是介面或指標
# 不支援方法過載
# 同一方法名繫結不同接收者型別,不視為重名
package main import "fmt" //面向過程普通函式 func add1(a,b int) (c int){ c = a+b return } //面向過程方法 //給自定義型別繫結方法 type long int func (tmp long)add2(a long) long{ return tmp+a } func main() { //匿名函式 c := func (a int,b int)(c int){ c = a+b return }(1,2) fmt.Println(c) var l long = 10 l = l.add2(3) fmt.Println(l) } type T *int func (t T) f(a int) int{ //無效接收者型別,編譯不通過 return a + int(*t) } type T2 int func (t *T2) f(a int) int{ //編譯通過 return a + int(*t) }
package main import "fmt" type Stu struct{ name string age int } type Sstu struct{ phone int addr string Stu sex byte } func main() { s := Stu{} ps := &s fmt.Printf("Stu %p %+v \n",ps,s) //方法繼承與重寫 ss := Sstu{Stu:Stu{name:"aaa"},sex:'m'} ss.Stu.test_p() //Stu 0xc000052460 {name:aaa age:0} ss.test_p() //繼承 //Stu 0xc000052460 {name:aaa age:0} ss.test() //重寫 //方法集 s.test() //值傳遞 s.test_p() //地址傳遞 ps.test_p() //地址傳遞 ps.test() //值傳遞 //方法值 儲存方法地址 f := s.test f() f = s.test_p f() //方法表示式 ff := (*Stu).test_p ff(&s) } func (s Stu) test(){ fmt.Printf("Stu %p %+v \n",&s,s) } func (ps *Stu) test_p(){ fmt.Printf("*Stu %p %+v \n",ps,*ps) } //方法重寫 func (ss Sstu) test(){ fmt.Printf("Sstu %p %+v \n",&ss,ss) }