首頁 >後端開發 >Golang >golang中什麼是接口

golang中什麼是接口

藏色散人
藏色散人原創
2019-12-25 17:19:473378瀏覽

golang中什麼是接口

golang 什麼是介面?

如果說goroutine和channel是Go並發的兩大基石,那麼介面就是Go語言程式設計中資料類型的關鍵。在Go語言的實際程式設計中,幾乎所有的資料結構都圍繞著介面展開,而介面是Go語言中所有資料結構的核心。

相關推薦:golang教學

golang中的介面

1. 介面

概念:介面定義了一組方法,但是不包含這些方法的具體實作;它們是抽象的,介面不能包含變數。

介面的定義格式

type Namer interface {
method1() return_type
method2() return_type
}

2. 一個介面的栗子

    package main
    import "fmt"
    
    type Message interface {
        Send()
    }
    type user struct {
        name string
        score int
    }
    func (u *user) Send() {
        fmt.Println("hi", u.name, "this is your ", u.score)
    }
    func sendMessage(msg Message) {
        msg.Send()
    }
    func main() {
        u := &user{name: "roty", score: 44}
        sendMessage(&u)
    }

Golang 中的interface 讓編碼更靈活、易擴展,使得Go 擁有了物件導向多型的特性。

在此我們記住三點就夠了:

● 方法宣告的集合

● 任何類型的物件實作了在介面中宣告的全部方法,則表示該類型實作了對應介面。

● 可以作為一種資料類型,實作了該介面的任何物件都可以給對應的介面類型變數賦值。

結合例子去理解上述三點:

package main
import "fmt"
import "math"
// 几何图形的接口(interface)
type geometry interface {
    area() float64
    perim() float64
}
// rect 和 circle 实现 geometry 接口
type rect struct {
    width, height float64
}
type circle struct {
    radius float64
}
// 实现了接口中声明的所有方法即实现了该接口,这里 rects 实现了 geometry 接口
func (r rect) area() float64 {
    return r.width * r.height
}
func (r rect) perim() float64 {
    return 2*r.width + 2*r.height
}
// circles 实现 geometry 接口
func (c circle) area() float64 {
    return math.Pi * c.radius * c.radius
}
func (c circle) perim() float64 {
    return 2 * math.Pi * c.radius
}
// 定义的接口可以作为一种数据类型,当一个变量的类型为一个接口类型时,这个变量可以调用接口中定义的方法。
// 这里定义一个函数,接收一个类型为 geometry 的参数变量
func measure(g geometry) {
    fmt.Println(g)
    fmt.Println(g.area())
    fmt.Println(g.perim())
}
func main() {
    r := rect{width: 3, height: 4}
    c := circle{radius: 5}
    // The circle and rect struct types both implement the geometry interface so we can use instances of these structs as arguments to measure.
    // rect 和 circle 结构类型都实现了 geometry 接口,所以我们能够把它们的对象作为参数传给 measure 函数
    // 在 measure 函数内部,参数对象调用了所属类型实现的接口方法。
    measure(r)
    measure(c)
}

一種類型只要實現接口聲明的方法就算實現了接口,同樣一種類型能同時支持實現多個接口了,一個接口也能被多種類型實現。如果一種類型實作了某個接口,那麼這種類型的物件就能夠賦值給這個接口類型的變數。

package main
import "fmt"
type I interface {
  method1()
}
type T struct{}
func (T) method1()  {}
func main()  {
  var i I = T{}
  fmt.Println(i)
}

最後的一部分解釋一下 interface{} 類型,這種類型的介面沒有宣告任何一個方法,俗稱空介面。因為任何類型的物件都預設實現了空接口(上文提到任意類型只要實現了接口的方法就算實現了對應的接口,由於空接口沒有方法,故所有類型默認都實現了空接口)在需要任意類型變數的場景下非常有用。

package main
import (
    "fmt"
)
func PrintAll(vals []interface{}) {
    for _, val := range vals {
        fmt.Println(val)
    }
}
func main() {
    names := []string{"stanley", "david", "oscar"}
    vals := make([]interface{}, len(names))
    for i, v := range names {
        vals[i] = v
    }
    PrintAll(vals)
}
// stanley
// david
// oscar

以上是golang中什麼是接口的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn