検索
ホームページバックエンド開発Golanggolangのインターフェースの紹介

次のコラム golang チュートリアル では、golang のインターフェイスについて紹介します。困っている友人の役に立てば幸いです。

golangのインターフェースの紹介

#Go 言語では、インターフェイスは型、つまり抽象型です。

インターフェースの定義

定義形式:

type 接口类型名 interface{
    方法名1( 参数列表1 ) 返回值列表1
    方法名2( 参数列表2 ) 返回值列表2
    …
}

Go 言語のインターフェースに名前を付ける場合、通常は単語の後に er を追加します。 be インターフェイスのタイプの意味を強調表示します。

インターフェースの実装

オブジェクトがインターフェース内のすべてのメソッドを実装している限り、そのオブジェクトはインターフェースを実装します。
Go 言語の異なる型でも同じインターフェイスを実装できます。 (この例では、犬と猫の両方が Animal インターフェースを実装しています)

//定义一个Animal接口// Animal 是一个动物接口,实现move()和say()方法type Animal interface {
    move()
    say()
}//定义dog结构体type dog struct {
    name string
}//定义cat结构体type cat struct {
    name string
}//dog实现move方法func (d dog) move() {
    fmt.Printf("%s会跑\n",d.name)
}//dog实现say方法func (d dog) say() {
    fmt.Printf("%s会叫汪汪汪\n",d.name)
}//cat实现move方法func (c *cat) move() {
    fmt.Printf("%s会跑\n",c.name)
}//cat实现say方法func (c cat) say() {
    fmt.Printf("%s会叫喵喵喵\n",c.name)
}func main()  {    var a Animal    //声明一个Animal类型的a    //实例化一个dog结构体
    d := dog{name:"旺财"}
    fmt.Printf("%T\n", d)       //main.dog
    d.move()    //旺财会跑
    d.say()     //旺财会叫汪汪汪
    a = d // 接口是一种类型,一种抽象的类型。
    fmt.Println(a)  //{旺财}    //实例化一个cat结构体
    c := cat{name:"蓝猫"}
    c.move()    //蓝猫会跑
    c.say()     //蓝猫会叫喵喵喵
}

ポリモーフィズム

GO 言語は、インターフェースを通じてポリモーフィズムをシミュレートします。

型とインターフェイスの関係

型は複数のインターフェイスを同時に実装できますが、インターフェイスは互いに独立しており、互いの実装を認識しません。
Go 言語の異なる型でも同じインターフェイスを実装できます。

インターフェイスのネスト

インターフェイス間のネストを通じて、新しいインターフェイスを作成できます。

//定义speaker接口type speaker interface {
    speak()
}//定义mover接口type mover interface {
    move()
}// 接口嵌套type animal interface {
    speaker
    mover
}//定义cat结构体type cat struct {
    name string
}//cat是值类型接收者func (c cat) speak() {
    fmt.Println("喵喵喵")
}func (c cat) move() {
    fmt.Println("猫会动")
}func main()  {    var x animal
    x = cat{name: "花花"}
    x.move()    //猫会动
    x.speak()   //喵喵喵
}

空のインターフェイス

空のインターフェイス定義

空のインターフェイスとは、メソッドが定義されていないインターフェイスを指します。空のインターフェイス タイプの変数には、任意のタイプの変数を格納できます。

//空接口func main()  {    var x interface{}
    x = 100     //int类型
    fmt.Println(x)  //100
    x = "ares"  //string类型
    fmt.Println(x)  //ares
    x = struct {    //结构体类型
        name string
    }{name:"ares"}  //结构体赋值
    fmt.Println(x)  //ares
}

空のインターフェイス アプリケーション

空のインターフェイスは、関数のパラメーターまたはマップの値として使用できます。

//空接口func showType(a interface{}) {
    fmt.Printf("type:%T\n", a)
}func main()  {    //空接口作为函数的参数
    showType(100)       //type:int
    showType("ares")    //type:string    //定义一个值为空接口的map    var stu = make(map[string]interface{},100)
    stu["ares"] = 100
    stu["ares1"] = "男"
    fmt.Println(stu)    //map[ares:100 ares1:男]    //map,key是字符串,value是任意类型
    map1 := make(map[string]interface{})
    map1["name"] = "ares"
    map1["age"] = 18
    map1["id"] = 1
    map1["friend"] = struct {
        name string
        age  int
    }{"jay", 33}
    fmt.Println(map1) //map[age:18 friend:{jay 33} id:1 name:ares]
    }

インターフェイスのネスト

は継承に似ています。

type A interface {
    test1()
}type B interface {
    test2()
}type C interface {
    A
    B
    test3()
}type Cat struct { //如果要实现接口c,需要将接口a和接口b中的方法一起实现
}func (c Cat) test1() {
    fmt.Println("test1...")
}func (c Cat) test2() {
    fmt.Println("test2...")
}func (c Cat) test3() {
    fmt.Println("test3...")
}func main() {    var cat = Cat{}
    cat.test1() //test1...
    cat.test2() //test2...
    cat.test3() //test3...    //将cat赋值接口A类型,则只能使用test1方法    var cat1 A = Cat{}
    cat1.test1() //test1...    //将cat赋值接口B类型,则只能使用test2方法    var cat2 B = Cat{}
    cat2.test2() //test2...
}

型アサーション

構文:

x.(T)

xx: インターフェイス型の変数を表します。{}
T : アサーション x のタイプを示します
true の場合はアサーションが成功したことを示し、false の場合はアサーションが失敗したことを示します。

//类型断言func justifyType(x interface{}) {    switch v := x.(type) {    case string:
        fmt.Printf("x is a string,value is %v\n", v)    case int:
        fmt.Printf("x is a int is %v\n", v)    case bool:
        fmt.Printf("x is a bool is %v\n", v)    case *string:
        fmt.Printf("x is a point指针 is %v\n", v)    case struct{}:
        fmt.Printf("x is a struct is %v\n", v)    default:
        fmt.Println("unsupport type!")
    }}func main()  {
    justifyType(100)        //x is a int is 100
    justifyType("ares") //x is a string,value is ares
    justifyType(false)  //x is a bool is false
    x := "ares"
    justifyType(&x) //x is a point指针 is 0xc000094010
    justifyType(struct {}{})    //x is a struct is {}
    justifyType([]int{123}) //unsupport type!
}

値レシーバポインタ レシーバ実装インターフェイスの違い

レシーバがポインタ型の場合、値を指定することはできません。渡してください。

rree

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

声明
この記事はcnblogsで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
Goroutinesの理解:Goの同時性に深く潜りますGoroutinesの理解:Goの同時性に深く潜りますMay 01, 2025 am 12:18 AM

GoroutinesAreSareSareSareSormethodSthaturncurlyntingo、Enableing and LightweightConcurrency.1)theyRuntimeSimeSingMultiplexing、SountyStorunonFeweroSthReads.2)ゴルチンズを失ったことを許可します

go:目的と使用法でのinit機能を理解するgo:目的と使用法でのinit機能を理解するMay 01, 2025 am 12:16 AM

initistoistoInitializevariables、setupconutupurations、orforformndexedarysetupbe foreThemainfunctionexecutes.useinitby:1)inginginyourcodeTorunautorunaintalunain、2)KeepingItshortandpocusedonsimpletasks、3)ConsididiriveSusinginsingingingingingingingingingingingingingingingingingingingingingingsingpltassksを使用すると、

GOインターフェイスの理解:包括的なガイドGOインターフェイスの理解:包括的なガイドMay 01, 2025 am 12:13 AM

go interfacesaremethodsignaturesetsetsattypesmustimplement、unableingpolymorphism withintinheritance forcleaner、modularcode.theyareimplictilistifisisfiestified、houseforfflexibleapisanddeaupling、busrecarefulusoavoidoidoimoidimeerrororsypertety。

GOのパニックからの回復:いつ、どのように使用するか()GOのパニックからの回復:いつ、どのように使用するか()May 01, 2025 am 12:04 AM

Goで回復()関数を使用して、パニックから回復します。特定の方法は次のとおりです。1)回復()を使用して、延期関数でパニックをキャプチャして、プログラムのクラッシュを避けます。 2)デバッグの詳細なエラー情報を記録します。 3)特定の状況に基づいてプログラムの実行を再開するかどうかを決定します。 4)パフォーマンスに影響を及ぼさないように注意して使用します。

「文字列」をどのように使用しますかGoで文字列を操作するパッケージ?「文字列」をどのように使用しますかGoで文字列を操作するパッケージ?Apr 30, 2025 pm 02:34 PM

この記事では、弦の操作にGOの「文字列」パッケージを使用し、効率を高め、ユニコードを効果的に処理するための一般的な機能とベストプラクティスの詳細を説明します。

「crypto」をどのように使用しますかGoで暗号化操作を実行するパッケージ?「crypto」をどのように使用しますかGoで暗号化操作を実行するパッケージ?Apr 30, 2025 pm 02:33 PM

記事の詳細は、暗号化操作のためのGoの「暗号」パッケージ、安全な実装のための主要な生成、管理、およびベストプラクティスについて議論するためのパッケージ。

「時間」をどのように使用しますかGOの日付と時間を処理するパッケージ?「時間」をどのように使用しますかGOの日付と時間を処理するパッケージ?Apr 30, 2025 pm 02:32 PM

この記事では、現在の時間の取得、特定の時間の作成、文字列の解析、経過時間の測定など、日付、時間、およびタイムゾーンを処理するためのGoの「時間」パッケージの使用について詳しく説明しています。

「反射」をどのように使用しますかGOの変数のタイプと値を検査するパッケージ?「反射」をどのように使用しますかGOの変数のタイプと値を検査するパッケージ?Apr 30, 2025 pm 02:29 PM

記事では、可変検査と変更のためにGOの「反射」パッケージを使用して、方法とパフォーマンスの考慮事項を強調するために説明します。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。