Go的Ducktype
生活随笔
收集整理的這篇文章主要介紹了
Go的Ducktype
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
代碼
package main import ("fmt""reflect" )// 如果某個(gè)變量 t(person) 的類(lèi)型 T(Person) 實(shí)現(xiàn)了某個(gè)接口 I(ISayHello) 所要求的所有方法, // 那么這個(gè)變量 t(person) 就能被賦值給 I(ISayHello) 的接口變量 i。 // 調(diào)用 i 的方法, // 最終就是調(diào)用 t(person) 的方法 type ISayHello interface {// 這里只是保證會(huì)被賦值 // 類(lèi)型a的變量a可以賦值給類(lèi)型b的變量bSayHello() } func greeting(i ISayHello) {fmt.Println("本身interface");// 此時(shí)這個(gè)i就已經(jīng)等于person了 就是person的SayHello()方法i.SayHello()fmt.Println(reflect.TypeOf(i));//main.Personfmt.Println("本身interface");// 本身interface// Hello!// 本身interface }type Person struct {name string } func (person Person) SayHello() {fmt.Printf("Hello!") }func main () {// person是一個(gè)變量 // Person是一種數(shù)據(jù)類(lèi)型 表明person是一個(gè)Person類(lèi)型的變量// 結(jié)構(gòu)體的賦值 就是這樣 // 前面是結(jié)構(gòu)體的名字// 后面{}是對(duì)屬性進(jìn)行賦值person := Person{name:"duck type"}fmt.Println(person.name,person);//person.name是一個(gè)字符串 person是一個(gè)結(jié)構(gòu)體 ;duck type {duck type}var i ISayHello // 一個(gè)接口 變量為i// 因?yàn)閜erson實(shí)現(xiàn)了ISayHello接口的所有方法 // 所以person能夠賦值給i// 什么時(shí)候能夠賦值呢?就是一個(gè)接口與一個(gè)變量的方法都一樣的時(shí)候 // 就可以進(jìn)行賦值// 這里 i一被賦值 i的類(lèi)型變了 變成了Personi = person // 這個(gè)賦值是在說(shuō):person變量賦值給了變量ifmt.Println(i); // {duck type}fmt.Println(reflect.TypeOf(i)); //main.Personfmt.Println(reflect.TypeOf(person));//main.Persongreeting(i) // 最后輸出: Hello! 表明i有了person的屬性 是Person數(shù)據(jù)類(lèi)型了person.SayHello() //Hello!i.SayHello(); //Hello!}// 第一,類(lèi)型 T 不需要顯式地聲明它實(shí)現(xiàn)了接口 I(就是說(shuō)不需要Person=ISayHello), // 只要類(lèi)型 T 實(shí)現(xiàn)了所有接口 I 規(guī)定的函數(shù),它就自動(dòng)地實(shí)現(xiàn)了接口 I。 // 這樣就像動(dòng)態(tài)語(yǔ)言一樣省了很多代碼,少了許多限制。// 第二,在把 duck 或者 person 傳遞給 greeting 前, // 需要顯式或者隱式地把它們轉(zhuǎn)換為接口 I 的接口變量 i。 // 這樣就可以和其它靜態(tài)類(lèi)型語(yǔ)言一樣,在編譯時(shí)檢查參數(shù)的合法性。分析
隱式:類(lèi)型的方法只要一樣? 就是說(shuō)兩個(gè)類(lèi)型是一樣的
顯式:變量需要相等(前提是兩個(gè)類(lèi)型的方法都一樣) 這樣可以調(diào)用方法了
總結(jié)
interface的類(lèi)型很弱? 可以被覆蓋!
如果兩個(gè)類(lèi)型的方法是一致的
那么他們的變量是可以相等的
然后
可以?xún)蓚€(gè)類(lèi)型對(duì)應(yīng)的變量
兩個(gè)變量都可以相互調(diào)用對(duì)方的方法
方法都是一樣的? 當(dāng)然可以相互調(diào)用了 哈哈哈
總結(jié)
以上是生活随笔為你收集整理的Go的Ducktype的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一寸、两寸、三寸照片尺寸是多少?
- 下一篇: Go判断输出数据类型