Go的Ducktype
生活随笔
收集整理的這篇文章主要介紹了
Go的Ducktype
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
代碼
package main import ("fmt""reflect" )// 如果某個變量 t(person) 的類型 T(Person) 實現了某個接口 I(ISayHello) 所要求的所有方法, // 那么這個變量 t(person) 就能被賦值給 I(ISayHello) 的接口變量 i。 // 調用 i 的方法, // 最終就是調用 t(person) 的方法 type ISayHello interface {// 這里只是保證會被賦值 // 類型a的變量a可以賦值給類型b的變量bSayHello() } func greeting(i ISayHello) {fmt.Println("本身interface");// 此時這個i就已經等于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是一個變量 // Person是一種數據類型 表明person是一個Person類型的變量// 結構體的賦值 就是這樣 // 前面是結構體的名字// 后面{}是對屬性進行賦值person := Person{name:"duck type"}fmt.Println(person.name,person);//person.name是一個字符串 person是一個結構體 ;duck type {duck type}var i ISayHello // 一個接口 變量為i// 因為person實現了ISayHello接口的所有方法 // 所以person能夠賦值給i// 什么時候能夠賦值呢?就是一個接口與一個變量的方法都一樣的時候 // 就可以進行賦值// 這里 i一被賦值 i的類型變了 變成了Personi = person // 這個賦值是在說:person變量賦值給了變量ifmt.Println(i); // {duck type}fmt.Println(reflect.TypeOf(i)); //main.Personfmt.Println(reflect.TypeOf(person));//main.Persongreeting(i) // 最后輸出: Hello! 表明i有了person的屬性 是Person數據類型了person.SayHello() //Hello!i.SayHello(); //Hello!}// 第一,類型 T 不需要顯式地聲明它實現了接口 I(就是說不需要Person=ISayHello), // 只要類型 T 實現了所有接口 I 規定的函數,它就自動地實現了接口 I。 // 這樣就像動態語言一樣省了很多代碼,少了許多限制。// 第二,在把 duck 或者 person 傳遞給 greeting 前, // 需要顯式或者隱式地把它們轉換為接口 I 的接口變量 i。 // 這樣就可以和其它靜態類型語言一樣,在編譯時檢查參數的合法性。分析
隱式:類型的方法只要一樣? 就是說兩個類型是一樣的
顯式:變量需要相等(前提是兩個類型的方法都一樣) 這樣可以調用方法了
總結
interface的類型很弱? 可以被覆蓋!
如果兩個類型的方法是一致的
那么他們的變量是可以相等的
然后
可以兩個類型對應的變量
兩個變量都可以相互調用對方的方法
方法都是一樣的? 當然可以相互調用了 哈哈哈
總結
以上是生活随笔為你收集整理的Go的Ducktype的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一寸、两寸、三寸照片尺寸是多少?
- 下一篇: 如何选择适合自己的家庭装修灯具?