>  기사  >  백엔드 개발  >  golang 인터페이스 소개

golang 인터페이스 소개

藏色散人
藏色散人앞으로
2020-09-15 10:21:352573검색

다음 칼럼에서는 golang 튜토리얼 칼럼에서 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()     //蓝猫会叫喵喵喵
}

Polymorphism

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 인터페이스

Empty 인터페이스 정의

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...
}

Type Assertion

구문: ​​

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제