前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang之旅38-类型断言

Golang之旅38-类型断言

作者头像
皮大大
发布2021-03-02 16:09:57
2790
发布2021-03-02 16:09:57
举报
文章被收录于专栏:机器学习/数据可视化

类型断言

如何将一个接口变量,赋值给一个自定义类型的变量?

代码语言:javascript
复制
package main
import "fmt"

type Point struct {
  x int
  y int
}

func main(){
  // 案例1
  var a interface{}   // a 是空接口变量
  var point Point = Point{1, 2}
  a = point   // ok
  var b Point
  b = a.(Point)   // 类型断言:判断 a 是否是指向Point类型的变量;如果是,则转成Point类型并赋给 b 变量,否则报错
  fmt.Println(b)

  // 案例2
  var x interface{}
  var c float32 = 1.1
  x = c   // 空接口可以接收任意类型
  //y = x.(float64)  运行出现panic,不匹配
  y = x.(float32)   // 使用类型断言;类型要匹配

  // 带检测的类型断言
  if y, ok := x.(float32); ok == true{
    fmt.Println("convert succeed")
    fmt.Println(y)
  }else {
    fmt.Println("convert fail")
  }

  fmt.Println("继续执行")
}
代码语言:javascript
复制
package main
import "fmt"

// 定义接口
// 在接口中定义方法
type Usber interface{
  Start()
  Stop()
}

// 定义两个结构体
type Phone struct{}

type Camera struct{}

// 给 phone 实现接口中全部的方法
func (p Phone) Start(){
  fmt.Println("手机开始工作")
}
func (p Phone) Stop(){
  fmt.Println("手机停止工作")
}

// 给 camera 实现接口中全部的方法
func (c Camera) Start(){
  fmt.Println("相机开始工作")
}
func (c Camera) Stop(){
  fmt.Println("相机停止工作")
}

type Computer struct{}

func (c Computer) Working(usb Usber){
  // 通过接口变量 usb 来调用接口 Usber 中的方法
  usb.Start()
  // 需求:当是手机Phone的时候,增加 call() 的方法
  // 不能直接使用usb.call():否则camera中也会拥有call的方法
  if phone,ok := usb.(Phone);ok{   // 类型断言
    phone.Call()
  }
  usb.Stop()
}

func main(){
  // 创建结构体变量
  var usbArr [3]Usb
  usbArr[0] = Phone{"vivo"}
  usbArr[1] = Phone{"小米"}
  usbArr[2] = Phone{"尼康"}

  for _,v := range usbArr{
    computer.Working(v)
    fmt.Println()
  }
}
代码语言:javascript
复制
package main
import "fmt"

type Student struct{
}

// 编写函数,判断输入的参数是什么类型
func TypeJudge(items... interface{}){  // 可变参数...
  for index, x := range items{
    switch x.(type){
    	case bool:
      	fmt.Println(index, x)
      case float32:
      	fmt.Println(index, x)
      case int, int32, int64:
        fmt.Println(index, x)
      case Student:
      	fmt.Println(index, x)
      case *Student:
      	fmt.Println(index, x)
      default:
      	fmt.Println("类型不确定")
    }
  }
}

func main(){
  var n1 float32 = 1.1
  var n2 float64 = 2.3
  var name string = "xiaoming"
  address := "北京"
  n4 := 300

  stu1 := Student{}
  stu2 := &Student{}

  TypeJudge(n1, n2, name, address, n4, stu1, stu2)
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 类型断言
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档