• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

7.2Gotypeassertion

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

类型断言是使用在接口值上的操作。

语法x.(T)被称为类型断言,x代表接口的类型,T代表一个类型检查。

类型断言检查它操作对象的动态类型是否和断言类型匹配

类型断言快速入门

package main

import (
    "fmt"
)

type Point struct {
    x int
    y int
}

func main() {

    var a interface{}
    var point Point = Point{1, 2}
    //任何类型都实现了空接口
    a = point
    fmt.Printf("类型:%T 值:%v\n", a, a)

    /*
        想要将a赋值给b变量,可以直接这么玩吗?
        var b Point
        b = a
        报错
        cannot use a (type interface {}) as type Point in assignment: need type assertion
        提示需要类型断言type assertion
    */
    var b Point
    b, ok := a.(Point)
    if ok {
        fmt.Printf("类型:%T 值:%v\n", b, b)
    }
}

1.1. 类型断言介绍

在类型断言时,如果类型不匹配,程序会直接panic异常退出,因此要确保类型断言,空接口指向的就是断言的类型,或者加上检查机制,防止程序panic退出。

package main

import (
    "fmt"
)

//test函数接收一个空接口,可以接收任意的数据类型
func test(a interface{}) {

    //带有检查机制的类型断言,ok是布尔值,返回true或false
    s, ok := a.(int)
    if ok {
        fmt.Println(s)
        //手动return结束这个类型检查
        return
    }

    str, ok := a.(string)
    if ok {
        fmt.Println(str)
        return
    }

    f, ok := a.(float32)
    if ok {
        fmt.Println(f)
        return
    }

    fmt.Println("can not define the type of a")
}

//测试test函数类型检查
func testInterface1() {
    var a int = 100
    test(a)

    var b string = "hello"
    test(b)
}

//使用分支判断,检测类型断言
func testSwitch(a interface{}) {
    //直接switch跟着类型断言表达式
    switch a.(type) {
    case string:
        fmt.Printf("a is string, value:%v\n", a.(string))
    case int:
        fmt.Printf("a is int, value:%v\n", a.(int))
    case int32:
        fmt.Printf("a is int, value:%v\n", a.(int))
    default:
        fmt.Println("not support type\n")
    }
}

func testSwitch2(a interface{}) {
    //将类型断言结果赋值给变量
    switch v := a.(type) {
    case string:
        fmt.Printf("a is string, value:%v\n", v)
    case int:
        fmt.Printf("a is int, value:%v\n", v)
    case int32:
        fmt.Printf("a is int, value:%v\n", v)
    default:
        fmt.Println("not support type\n")
    }
}

func testInterface2() {
    var a int = 123456
    testSwitch(a)
    fmt.Println("-------------")
    var b string = "hello"
    testSwitch(b)
}

func testInterface3() {
    var a int = 100
    testSwitch2(a)
    var b string = "hello"
    testSwitch2(b)
}

func main() {
    //testInterface1()
    //testInterface2()
    testInterface3()
}

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Go入门笔记-22访问sqlite3数据库发布时间:2022-07-10
下一篇:
19 Go的全能ORM简单入门发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap