1. 程式人生 > >Go/面向物件特性/方法-封裝

Go/面向物件特性/方法-封裝

# 可以為任意自定義型別(結構體、基礎資料型別)繫結方法,但不包括指標型別

# 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)
}