ホームページ > バックエンド開発 > Golang > golangのインターフェースとは何ですか

golangのインターフェースとは何ですか

藏色散人
リリース: 2019-12-25 17:19:47
オリジナル
3370 人が閲覧しました

golangのインターフェースとは何ですか

golang インターフェースとは何ですか?

ゴルーチンとチャネルが Go 同時実行性の 2 つの基礎である場合、インターフェースは 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 のインターフェースを使用すると、コーディングがより柔軟で簡単になります。 Expand を使用すると、Go にオブジェクト指向ポリモーフィズムの特性を持たせることができます。

ここでは 3 つの点を覚えておくだけで十分です。

#● メソッド宣言のコレクション

# どのタイプのオブジェクトでも、インターフェイス メソッドで宣言されたものはすべて実装されます。型が対応するインターフェイスを実装していることを示します。

# データ型として使用でき、このインターフェイスを実装するオブジェクトは対応するインターフェイス型変数に値を割り当てることができます。

例を組み合わせて、上記の 3 つの点を理解してください:

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)
}
ログイン後にコピー

最後の部分では、インターフェース タイプについて説明します。このタイプのインターフェースはメソッドを宣言せず、一般に空のインターフェースとして知られています。どのタイプのオブジェクトでもデフォルトで空のインターフェースが実装されるため (前述したように、どのタイプでもインターフェース・メソッドを実装している限り、対応するインターフェースが実装されます。空のインターフェースにはメソッドがないため、すべてのタイプがデフォルトで空のインターフェースを実装します)必要な場合は、型変数のコンテキストで非常に役立ちます。

rree

以上がgolangのインターフェースとは何ですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート