溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

go語言中的接口是什么

發(fā)布時(shí)間:2020-06-12 19:56:00 來源:億速云 閱讀:141 作者:鴿子 欄目:編程語言

golang 什么是接口?

如果說goroutine和channel是Go并發(fā)的兩大基石,那么接口是Go語言編程中數(shù)據(jù)類型的關(guān)鍵。在Go語言的實(shí)際編程中,幾乎所有的數(shù)據(jù)結(jié)構(gòu)都圍繞接口展開,接口是Go語言中所有數(shù)據(jù)結(jié)構(gòu)的核心。

相關(guān)推薦:golang教程

golang中的接口

1. 接口

概念:接口定義了一組方法,但是不包含這些方法的具體實(shí)現(xiàn);它們是抽象的,接口不能包含變量。

接口的定義格式

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

2. 一個(gè)接口的栗子

    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 讓編碼更靈活、易擴(kuò)展,使得 Go 擁有了面向?qū)ο蠖鄳B(tài)的特性。

在此我們記住三點(diǎn)就夠了:

● 方法聲明的集合

● 任何類型的對(duì)象實(shí)現(xiàn)了在接口中聲明的全部方法,則表明該類型實(shí)現(xiàn)了對(duì)應(yīng)接口。

● 可以作為一種數(shù)據(jù)類型,實(shí)現(xiàn)了該接口的任何對(duì)象都可以給對(duì)應(yīng)的接口類型變量賦值。

結(jié)合例子去理解上述三點(diǎn):

package main
import "fmt"
import "math"
// 幾何圖形的接口(interface)
type geometry interface {
    area() float64
    perim() float64
}
// rect 和 circle 實(shí)現(xiàn) geometry 接口
type rect struct {
    width, height float64
}
type circle struct {
    radius float64
}
// 實(shí)現(xiàn)了接口中聲明的所有方法即實(shí)現(xiàn)了該接口,這里 rects 實(shí)現(xiàn)了 geometry 接口
func (r rect) area() float64 {
    return r.width * r.height
}
func (r rect) perim() float64 {
    return 2*r.width + 2*r.height
}
// circles 實(shí)現(xiàn) geometry 接口
func (c circle) area() float64 {
    return math.Pi * c.radius * c.radius
}
func (c circle) perim() float64 {
    return 2 * math.Pi * c.radius
}
// 定義的接口可以作為一種數(shù)據(jù)類型,當(dāng)一個(gè)變量的類型為一個(gè)接口類型時(shí),這個(gè)變量可以調(diào)用接口中定義的方法。
// 這里定義一個(gè)函數(shù),接收一個(gè)類型為 geometry 的參數(shù)變量
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 結(jié)構(gòu)類型都實(shí)現(xiàn)了 geometry 接口,所以我們能夠把它們的對(duì)象作為參數(shù)傳給 measure 函數(shù)
    // 在 measure 函數(shù)內(nèi)部,參數(shù)對(duì)象調(diào)用了所屬類型實(shí)現(xiàn)的接口方法。
    measure(r)
    measure(c)
}

一種類型只要實(shí)現(xiàn)接口聲明的方法就算實(shí)現(xiàn)了接口,同樣一種類型能同時(shí)支持實(shí)現(xiàn)多個(gè)接口了,一個(gè)接口也能被多種類型實(shí)現(xiàn)。如果一種類型實(shí)現(xiàn)了某個(gè)接口,那么這種類型的對(duì)象能夠賦值給這個(gè)接口類型的變量。

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

最后的一部分解釋一下 interface{} 類型,這種類型的接口沒有聲明任何一個(gè)方法,俗稱空接口。因?yàn)槿魏晤愋偷膶?duì)象都默認(rèn)實(shí)現(xiàn)了空接口(上文提到任意類型只要實(shí)現(xiàn)了接口的方法就算實(shí)現(xiàn)了對(duì)應(yīng)的接口,由于空接口沒有方法,故所有類型默認(rèn)都實(shí)現(xiàn)了空接口)在需要任意類型變量的場(chǎng)景下非常有用。

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中什么是接口的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注億速云其它相關(guān)文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI