次のコラム 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 サイトの他の関連記事を参照してください。