Golang 类型断言

基本介绍

类型断言,由于接口(interface)是一般类型,不知道具体类。如果要转成具体类型,就需要使用类型断言

基本使用

package main

import "fmt"

type Person struct {
    Name string
}

func main() {
    var a interface{} // 空接口
    person := Person{
        Name: "宋江",
    }
    a = person // Person结构体类型可直接赋值给空接口,因为空接口也接受任何数据类型
    fmt.Println(a)

    var person2 Person
    // person2 = a // 错误!接口类型不能直接复制给Person结构体类型,需要使用类型断言
    person2, ok := a.(Person) // (Person)就是类型断言,ok变量接受是否转换成功,成功true 失败false
    if ok {
        fmt.Printf("转换成功,type=%T,person2=%v\n", person2, person2)
    } else {
        fmt.Println("转换失败")
    }
}

类型断言的最佳实践一

package main

import "fmt"

type Usb interface {
    Start()
    Stop()
}

type Computer struct {
}

func (computer Computer) Working(usb Usb) {
    usb.Start()
    // 类型断言的引用,当Usb接口为手机时调用Call()
    if phone, ok := usb.(Phone); ok {
        phone.Call()
    }
    usb.Stop()
}

type Phone struct{}

func (phone Phone) Start() {
    fmt.Println("手机开始工作...")
}
func (phone Phone) Stop() {
    fmt.Println("手机停止工作...")
}
func (phone Phone) Call() {
    fmt.Println("手机打电话...")
}

type Camera struct{}

func (camera Camera) Start() {
    fmt.Println("相机开始工作...")
}
func (camera Camera) Stop() {
    fmt.Println("相机停止工作...")
}

func main() {
    phone := Phone{}
    camera := Camera{}
    computer := Computer{}
    computer.Working(phone)
    computer.Working(camera)
}

类型断言的最佳实践二

package main

import "fmt"

type Person struct{}

func TypeAnalyse(items ...interface{}) {
    for index, value := range items {
        index += 1
        switch value.(type) {
        case bool:
            fmt.Printf("第%d行参数类型是bool,值%v\n", index, value)
        case string:
            fmt.Printf("第%d行参数类型是string,值%v\n", index, value)
        case int, int32, int64:
            fmt.Printf("第%d行参数类型是整数,值%v\n", index, value)
        case float32, float64:
            fmt.Printf("第%d行参数类型是浮点,值%v\n", index, value)
        case Person:
            fmt.Printf("第%d行参数类型是Person,值%v\n", index, value)
        case *Person:
            fmt.Printf("第%d行参数类型是*Person,值%v\n", index, value)
        }
    }
}

func main() {
    var n1 int = 100
    var n2 float32 = 200.00
    n3 := "鲁智深"
    n4 := Person{}
    n5 := &Person{}
    n6 := true
    TypeAnalyse(n1, n2, n3, n4, n5, n6)
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值