GO語言介面

來源:互聯網
上載者:User
在 Go 語言中, 一個類只需要實現了介面要求的所有函數,我們就說這個類實現了該介面,
例如:
type File struct {// ...}func (f *File) Read(buf []byte) (n int, err error)func (f *File) Write(buf []byte) (n int, err error)func (f *File) Seek(off int64, whence int) (pos int64, err error)func (f *File) Close() error

這裡我們定義了一個 File 類,並實現有 Read() 、 Write() 、 Seek() 、 Close() 等方法。設想我們有如下介面:
type IFile interface {Read(buf []byte) (n int, err error)Write(buf []byte) (n int, err error)Seek(off int64, whence int) (pos int64, err error)Close() error}type IReader interface {Read(buf []byte) (n int, err error)}type IWriter interface {Write(buf []byte) (n int, err error)}type ICloser interface {Close() error}

儘管 File 類並沒有從這些介面繼承,甚至可以不知道這些介面的存在,但是 File 類實現了這些介面,可以進行賦值:
var file1 IFile = new(File)var file2 IReader = new(File)var file3 IWriter = new(File)var file4 ICloser = new(File) 
樣本:
package mainimport ("fmt""math")type Abser interface {Abs() float64}func main() {var a Abserf := MyFloat(-math.Sqrt2)v := Vertex{3, 4}a = f  // a MyFloat 實現了 Abserfmt.Println(a.Abs())   //輸出1.4142135623730951a = &v // a *Vertex 實現了 Abserfmt.Println(a.Abs())   //輸出5// 下面一行,v 是一個 Vertex(而不是 *Vertex)// 所以沒有實現 Abser。報錯Vertex does not implement Abser (Abs method has pointer receiver)//a = v//fmt.Println(a.Abs())}type MyFloat float64func (f MyFloat) Abs() float64 {if f < 0 {return float64(-f)}return float64(f)}type Vertex struct {X, Y float64}func (v *Vertex) Abs() float64 {return math.Sqrt(v.X*v.X + v.Y*v.Y)}
介面查詢-----主要功能用來查詢一個介面的實現是否同時實現了另一個介面
package mainimport ("fmt""os")type Reader interface {Read(b []byte) (n int, err error)}type Writer interface {Write(b []byte) (n int, err error)}//介面組合type ReadWriter interface {ReaderWriter}type IWriter interface {IWrite(b []byte) (n int, err error)}func main() {var w Writer// os.Stdout 實現了 Writerw = os.Stdoutfmt.Fprintf(w, "hello, writer\n")var rw ReadWriterrw = os.Stdoutfmt.Fprintf(rw, "hello, writer\n")//介面查詢if _,ok := w.(Reader);ok {fmt.Println("實現了Reader介面") //因為w的執行個體是os.Stdout它不光實現了Write介面,還實現了Reader介面,所以此處有列印輸出}if _,ok := w.(IWriter);ok {fmt.Println("實現了IWriter介面")  //因為w的執行個體是os.Stdout它未實現了IWriter介面,所以此處無列印輸出}}
上邊的列印結果為
hello, writerhello, writer實現了Reader介面

package mainimport ("fmt""os")type Reader interface {Read(b []byte) (n int, err error)}func main() {//介面查詢var f float64 = 3.14var r Reader = os.StdoutqueryInterface(1, "a", r, f)}//args ...interface{}表示任意類型的參數func queryInterface(args ...interface{}) {for _, arg := range args {switch arg.(type) {case int: fmt.Println(arg, "現在的類型是int")case string: fmt.Println(arg, "現在的類型是string")case Reader: fmt.Println(arg, "現在的類型是Reader")default:fmt.Println(arg, "現在的類型未知")}}}

重寫包裡邊的介面實現
package mainimport "fmt"type Person struct {Name stringAge  int}//重寫fmt包中的Stringers介面的String()方法來實現自訂的列印輸出func (p Person) String() string {return fmt.Sprintf("%v (%v years)", p.Name, p.Age)}func main() {a := Person{"Arthur Dent", 42}z := Person{"Zaphod Beeblebrox", 9001}fmt.Println(a, z) //結果為Arthur Dent (42 years) Zaphod Beeblebrox (9001 years)}







相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.