我来了一个交叉使用.(string)方法的代码。不知道这叫什么,我很难找到它。这是我试图理解它:package mainimport "fmt"import "reflect"func main(){ var b interface{} b = "silly" fmt.Println(reflect.TypeOf(b.(string))) // we know that b // is a string // at compile time fmt.Println(reflect.TypeOf(b)) // we do not}结果:stringstring但是,我认为这reflect.TypeOf发生在运行时,while.(string)会告诉编译器b确实是一个字符串,这可用于告诉编译器某个变量是某种类型。我的理解对吗?
2 回答
慕沐林林
TA贡献2016条经验 获得超9个赞
b.(string)称为类型断言。正如Effective Go 中所写:
类型断言采用接口值并从中提取指定显式类型的值。
因此,是的,您从类型断言中获得的值不是接口值,而是显式类型。您还可以通过添加一个无类型的布尔值来测试类型断言是否成功:
s, ok := b.(string) // s is of type string
if !ok {
// b did not contain a value of type string!
}
编辑:
进一步解释以消除任何可能的误解:
类型断言不会像您建议的那样“告诉 Go b 是一个字符串”。它的作用是,在运行时,它会尝试从 中提取字符串b,如果b包含其他类型,则恐慌(除非分配可选的 bool 值)。
您从断言中获得的值确实是 type string,允许您执行切片(您不能对接口值进行切片)或检查其len.
- 2 回答
- 0 关注
- 199 浏览
添加回答
举报
0/150
提交
取消