다음 칼럼에서는 golang 튜토리얼 칼럼에서 golang 인터페이스를 소개하겠습니다. 필요한 친구들에게 도움이 되길 바랍니다!
Go 언어에서 인터페이스는 유형, 추상 유형입니다.
정의 형식:
type 接口类型名 interface{ 方法名1( 参数列表1 ) 返回值列表1 方法名2( 参数列表2 ) 返回值列表2 … }
Go 언어에서 인터페이스 이름을 지정할 때 일반적으로 인터페이스 이름은 인터페이스의 유형 의미를 강조해야 합니다.
객체가 인터페이스의 모든 메소드를 구현하는 한, 객체는 인터페이스를 구현합니다.
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() //喵喵喵 }
Empty 인터페이스는 어떠한 메소드도 정의하지 않은 인터페이스를 말합니다. 빈 인터페이스 유형의 변수는 모든 유형의 변수를 저장할 수 있습니다.
//空接口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)
x: 인터페이스 유형의 변수를 나타냅니다.{}
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! }
의 차이점 수신기가 포인터 유형인 경우 값을 전달할 수 없습니다.
아아아아위 내용은 golang 인터페이스 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!