• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
留白
世人慌慌张张,不过图碎银几两
博客园    首页    新随笔       管理    订阅  订阅
go tour --Type assertions

类型断言提供对接口值的底层具体值的访问。

t := i.(T)

该语句断言接口值i持有具体类型T,并将底层T值赋给变量t。
如果i不持有T,该语句将触发恐慌panic。

要测试接口值是否包含特定类型,类型断言可以返回两个值:底层值和报告断言是否成功的布尔值。

t, ok := i.(T)

如果i持有T,那么t的值就是底层值,ok就会为真。
如果不是,ok就会为假t就是类型T的零值,不会出现恐慌panic。
请注意此语法与从映射读取的语法之间的相似性。

Type switches

类型开关是一种允许在系列中使用多个类型断言的结构。
类型开关类似于常规的switch语句,但是类型开关中的用例指定类型(不是值),并且将这些值与给定接口值所包含的值的类型进行比较。

switch v := i.(type) {
case T:
    // here v has type T
case S:
    // here v has type S
default:
    // no match; here v has the same type as i
}

类型开关中的声明与类型断言i.(T)具有相同的语法,但是特定类型T被关键字type替换。

package main

import "fmt"

func do(i interface{}) {
	switch v := i.(type) {
	case int:
		fmt.Printf("Twice %v is %v\n", v, v*2)
	case string:
		fmt.Printf("%q is %v bytes long\n", v, len(v))
	default:
		fmt.Printf("I don't know about type %T!\n", v)
	}
}

func main() {
	do(21)
	do("hello")
	do(true)
}


// ==============================
Twice 21 is 42
"hello" is 5 bytes long
I don't know about type bool!
posted on 2020-07-17 16:06  留白s  阅读(129)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3