Go语言接口知识点2 和 别名

2018-09-28  本文已影响0人  超级皮波9

接口的断言

1. 如果结构体实现了某个接口你那么就可以使用接口类型来保存结构体变量, 那么该变量只能访问接口中的方法,不能访问结构中的特有方法,以及结构体中的属性
package main

import "fmt"

//定义一个接口
type USB interface{
    start()
}
//定义结构体Computer 实现接口
type Computer struct {
    name string
}
// 接口声明的方法
func (cm Computer)start(){
    fmt.Println(cm.name,"开机")
}

// say 方法是结构体 Computer 特有的方法 和接口USB 没有直接关系
func (cm Computer)say(){
    fmt.Println(cm.name)
}

func main() {
    // 定义接口变量 保存结构体类型
    var in USB = Computer{"联想电脑"}

    fmt.Println(in) // {联想电脑}

    in.start() // 联想电脑 开机
    
    fmt.Println(in.name)  // 报错 接口变量没有访问结构体内属性的权限
    
    in.say() // 报错  接口变量不能访问结构体特有的方法

}
微信图片_20180928150753.png
  1. 这种方法也可以用来把抽象的接口类型转为 具体的接口类型 或者结构体

2. 如果接口类型变量保存了实现接口的结构体,想要访问结构体特有的方法和属性,需要将接口类型转换为结构体类型

转化后的变量 , ok  := 接口类型变量名.( 结构体类型 ) 

方式一: 通过 value, ok := 接口变量名.(具体数据类型)
package main

import "fmt"

//定义一个接口
type USB interface{
    start()
}
//定义结构体Computer 实现接口
type Computer struct {
    name string
}
// 接口声明的方法
func (cm Computer)start(){
    fmt.Println(cm.name,"开机")
}

// say 方法是结构体 Computer 特有的方法 和接口USB 没有直接关系
func (cm Computer)say(){
    fmt.Println(cm.name)
}

func main() {
    // 定义接口变量 保存结构体类型
    var in USB = Computer{"联想电脑"}

    fmt.Println(in) // {联想电脑}

    in.start() // 联想电脑 开机

    cm,ok := in.(Computer)

    fmt.Println(ok)  // true
    fmt.Printf("cm = %T\n",cm) // cm = main.Computer

    // 企业一般这么写
    if cm,ok := in.(Computer);ok{
        fmt.Println(cm.name)
        cm.say()
    }

}

方式二: 通过switch value := 接口变量名.(type) { case 具体数据类型: }
package main

import "fmt"

//定义一个接口
type USB interface{
    start()
}
//定义结构体Computer 实现接口
type Computer struct {
    name string
}
// 接口声明的方法
func (cm Computer)start(){
    fmt.Println(cm.name,"开机")
}

// say 方法是结构体 Computer 特有的方法 和接口USB 没有直接关系
func (cm Computer)say(){
    fmt.Println(cm.name)
}

func main() {
    // 定义接口变量 保存结构体类型
    var in USB = Computer{"联想电脑"}

    fmt.Println(in) // {联想电脑}

    in.start() // 联想电脑 开机

    switch cm:= in.(type) {
    case Computer:
        fmt.Println(cm.name)
        cm.say()
    default:
        fmt.Println("不是Computer类型")
    }

}

别名

type Inter  int
  1. 格式1 代表重新定义了一个新的类型 叫做新类型名
  2. 格式1 定义的 新类型 和 愿类型在编译器开来是两个不同的类型
type  inter = int
  1. 格式二 代表给原类型名起了一个别名叫做新类型名
  2. 格式二 定义的新类型 和愿类型在编译器看来是同一个类型
上一篇 下一篇

猜你喜欢

热点阅读