<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                Golang 接口 : ~~~ 接口是一個或多個方法簽名的集合。 任何類型的方法集中只要擁有該接口'對應的全部方法'簽名。 就表示它 "實現" 了該接口,無須在該類型上顯式聲明實現了哪個接口。 這稱為Structural Typing。 所謂對應方法,是指有相同名稱、參數列表 (不包括參數名) 以及返回值。 當然,該類型還可以有其他方法。 接口只有方法聲明,沒有實現,沒有數據字段。 接口可以匿名嵌入其他接口,或嵌入到結構中。 對象賦值給接口時,會發生拷貝,而接口內部存儲的是指向這個復制品的指針,既無法修改復制品的狀態,也無法獲取指針。 只有當接口存儲的類型和對象都為nil時,接口才等于nil。 接口調用不會做receiver的自動轉換。 接口同樣支持匿名字段方法。 接口也可實現類似OOP中的多態。 空接口可以作為任何類型數據的容器。 一個類型可實現多個接口。 接口命名習慣以 er 結尾。 ~~~ Go 語言中的接口很特別,而且提供了難以置信的一系列靈活性和抽象性。它們指定一個特定類型的值和指針表現為特定的方式。從語言角度看,接口是一種類型,它指定一個方法集,所有方法為接口類型就被認為是該接口。 interface類型可以定義一組方法,但是這些不需要實現。并且interface不能包含任何變量。 interface類型默認是一個指針 interface語法: ~~~ type example interface{ Method1(參數列表) 返回值列表 Method2(參數列表) 返回值列表 … } var a example a.Method1() ~~~ 下面定義一個接口: ~~~ type Notifier interface { Notify() error } ~~~ 我們定義了一個叫做 Notifier 的接口并包含一個 Notify 方法。當一個接口只包含一個方法時,按照 Go 語言的約定命名該接口時添加 -er 后綴。這個約定很有用,特別是接口和方法具有相同名字和意義的時候。 我們可以在接口中定義盡可能多的方法,不過在 Go 語言標準庫中,你很難找到一個接口包含兩個以上的方法。 實現接口 Golang中的接口,不需要顯示的實現。只要一個變量,含有接口類型中的所有方法,那么這個變量就實現這個接口。因此,golang中沒有implement類似的關鍵字。 ~~~ package main import ( "fmt" ) type I interface { Method1() int Method2() string } type S struct { name string age int } func (s S) Method1() int { return s.age } func (s S) Method2() string { return s.name } func main() { var user I = S{"Murphy", 28} age := user.Method1() name := user.Method2() fmt.Println(age, name) } ~~~ 輸出結果: ~~~ 28 Murphy ~~~ 如果一個變量含有了多個interface類型的方法,那么這個變量就實現了多個接口。 ~~~ package main import ( "fmt" ) type I1 interface { Method1() int } type I2 interface { Method2() int } type S struct { name string age int } func (s S) Method1() int { return s.age } func (s S) Method2() string { return s.name } func main() { user := S{"Murphy", 28} age := user.Method1() name := user.Method2() fmt.Println(age, name) } ~~~ 輸出結果: ~~~ 28 Murphy ~~~ 如果一個變量只含有了1個interface的部分方法,那么這個變量沒有實現這個接口。 ~~~ package main import ( "fmt" ) type I interface { Method1() int Method2() string } type S struct { name string age int } func (s S) Method1() int { return s.age } // func (s S) Method2() string { // return s.name // } func main() { var user I = S{"Murphy", 28} age := user.Method1() // name := user.Method2() // fmt.Println(age, name) fmt.Println(age) } ~~~ 輸出結果: ~~~ ./main.go:26:6: cannot use S literal (type S) as type I in assignment: S does not implement I (missing Method2 method) ~~~ 當涉及到我們該怎么讓我們的類型實現接口時,Go 語言是特別的一個。Go 語言不需要我們顯式的實現類型的接口。如果一個接口里的所有方法都被我們的類型實現了,那么我們就說該類型實現了該接口。 多態: 一種事物的多種形態,都可以按照統一的接口進行操作。 ~~~ package main import "fmt" type Stringer interface { String() string } type Printer interface { Stringer // 接口嵌入。 Print() } type User struct { id int name string } func (self *User) String() string { return fmt.Sprintf("user %d, %s", self.id, self.name) } func (self *User) Print() { fmt.Println(self.String()) } func main() { var t Printer = &User{1, "Tom"} // *User 方法集包含 String、Print。 t.Print() } ~~~ 輸出結果: ~~~ user 1, Tom ~~~ 空接口 interface{} 沒有任何方法簽名,也就意味著任何類型都實現了空接口。其作用類似面向對象語言中的根對象 object。 ~~~ package main import "fmt" func Print(v interface{}) { fmt.Printf("%T: %v\n", v, v) } func main() { Print(1) Print("Hello, World!") } ~~~ 輸出結果: ~~~ int: 1 string: Hello, World! ~~~ *匿名接口可用作變量類型,或結構成員。 ~~~ package main import "fmt" type Tester struct { s interface { String() string } } type User struct { id int name string } func (self *User) String() string { return fmt.Sprintf("user %d, %s", self.id, self.name) } func main() { t := Tester{&User{1, "Tom"}} fmt.Println(t.s.String()) } ~~~ 輸出結果: ~~~ user 1, Tom ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看