Loading

Golang 接口的使用及注意细节

Go语言声明接口如下:

type Student interface{
    speak()
    eat()
}

注意:

  1. 接口的方法必须要全部实现
  2. 接口本身不能创建是实例,但是可以指向一个实现了该接口的自定义类型的变量(实例)
  3. 只要是自定义类型,就可以实现接口,不仅仅是结构体类型
  4. 接口中所有的方法都没有方法体,都是没有实现的方法,举例说明:
    package main
    import "fmt"
    type TestInterface interface{
        Speak()
    }
    
    type Stu struct{
        Name string
    }
    
    func(s Stu)Say(){
        fmt.Println("Stu Say()")
    }
    
    type interger int
    
    func(i interger)Say(){
        fmt.Println("interger Say()")
    }
    
    func main(){
        var stu Stu //结构体变量 实现了 Say()方法 也就实现了 TestInterface
        var a TestInterface = stu
        a.Say()
        
        //非结构体也可以实现接口
        var i interger = 100
        var b TestInterface = i
        b.Say()
        
    }
  5. 一个自定义类型可以实现多个接口
    //接口 Carver1
    type Carver1 interface{
        Say()
    }
    
    //接口 Carver2
    type Carver2 interface{
        Hello()
    }
    
    type CarverSelf struct{
    
    }
    
    func(c *CarverSelf)Say(){
        fmt.Println("CarverSelf Say")
    }
    func(c *CarverSelf)Hello(){
        fmt.Println("CarverSelf Hello")
    }
    
    func main(){
        //CarverSelf 实现了 Carver1 和 Carver2 接口
        var carver CarverSelf
        var a Carver1 = carver
        var b Carver1 = carver
        a.Say()
        b.Hello()
    }
  6. 接口中不能有任何变量
    //接口 Carver1
    type Carver1 interface{
        //Name string  不能有这样的变量
        Say()
    }
  7. 一个接口(接口A)可以继承多个别的接口(接口B、C),这时如果要实现接口A,就必须将接口B、C的方法也全部实现
    package main
    import "fmt"
    
    type BInterface interface{
        test1()
    }
    
    type CInterface interface{
        test2()
    }
    
    //里面的接口都要全部实现,否则编译不通过
    type AInterface interface{
        BInterface
        CInterface
        test3()
    }
    
    type Stu struct{
    
    }
    
    //方法test1【缺一不可】
    func(stu Stu)test1(){
    
    }
    //方法test2【缺一不可】
    func(stu Stu)test2(){
    
    }
    //方法test3【缺一不可】
    func(stu Stu)test3(){
    
    }
    
    type G interface{
    
    }
    
    func main(){
        var stu Stu
        var a AInterface = stu
        a.test1()
       
        //stu默认实现了空接口 写法1
        var g1 G = stu
        fmt.Println(g1)    //输出 nil
        //写法2
        var g2 interface{} = stu
        fmt.Println(g2)    //输出 nil
        //其它类型也可以
        var num  float64 = 1.2
        g1 = num
        g2 = num
        fmt.Println(g1,g2)//输出两个1.2
    }
  8. interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用那么会输出nil
  9. 空接口interface{}没有任何方法,所以所有类型都实现了空接口,即可以把任何一个变量赋给空接口

 

posted @ 2024-10-08 21:48  Carver大脸猫  阅读(4)  评论(0)    收藏  举报