1.結構體
在golang裏,沒有類的概念,但是如果非要實現像類那樣的例子,那或許就是結構體了,結構體是一系列變量的集合,
定義
type s_name struct {
v_name1 v_type1
v_name2 v_type2
}
聲明結構體類型的變量
var name = s_name{v_value1, v_value2}
//或者
var name = s_name{v_name1: v_value1, v_name2: v_value2}
可是這跟類比,還少類方法啊,的確,不過golang也能給結構體加上方法。
2.方法
golang裏,方法就是帶有接收者的函數,何爲接收者,即是任意類型(結構體,指針,接口等)的實例。函數跟類型綁定,即成了方法
定義
type Person struct {
name string
age int
}
//此處Person類型的person是sayHello方法的接收者,以後person可以調用此方法。
func (person Person) sayHello {
fmt.Println("hello,goodmorning")
}
person.sayHello()
//結構體在定義的時候,並沒有定義方法,但是通過上面的操作,就好像是該方法是結構體自己定義的一樣。有點反客爲主的意思。
把圖內文字換一下就是
方法:你有方法嘛?結構體
結構體:沒有
func (s Struct) Func {}
方法:那從現在起,你已經有了
當然方法不只是能綁定在結構體上,還能有很多類型。
3.接口
duck typing:假如,我認爲黃色的,長的像鴨子的動物都算是鴨子,那麼以後,只要是黃色的,長的像鴨子的東西,無論有沒有生命,大小如何,他在我的範疇裏都是鴨子。
duck typing 描述事物的外部行爲而非內部結構,爲多態的一種形式。是從使用者的角度來看的。如果我認爲長得像鴨子的東西是鴨子,那麼任何長的像鴨子的事物在我眼中就是鴨子
接口是一組方法簽名的集合,體現的是泛型的思想。
接口是隱式實現的,只要實現了接口裏的方法,就相當於實現了接口,即只要長的像鴨子,那麼就是鴨子。
type if_name interface{
method1()
method2()
}
type S1 struct {}
func (s1 S1) method1() {}
func (s1 S1) method2() {}
s1實現了method1(),method2()方法,那麼也就意味着S1實現了if_name這個接口,那麼以後if_name就可以視爲S1類型,反之亦然,如果多個類型都實現了兩個方法,那麼多個類型都可視爲if_name類型,那麼if_name就可以當做很多類型使用,這也許能稱之爲泛型吧。那麼定義這樣一個接口類型的數組,即可以裝下各種實現了接口所有方法 的不同類型了。