我遇到了使用.(string)方法的一段代码。不知道这叫什么,我很难找到它。
.(string)
这是我尝试了解的内容:
package main import "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 }
结果:
string string
但是,我认为这reflect.TypeOf是在运行时发生的,它.(string)会告诉编译器b确实是一个字符串,并且可以用来告诉编译器变量是某种类型的。我的理解正确吗?
reflect.TypeOf
b
游乐场
b.(string)被称为 类型断言 。如 有效围棋中所述 :
b.(string)
类型断言采用接口值并从中提取指定的显式类型的值。
因此,是的,您从类型断言中获得的值不是接口值,而是显式类型。您还可以通过添加无类型的布尔值来测试类型断言是否成功:
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值)。
从断言中获得的值确实是类型string,允许您执行诸如切片(无法切片接口值)或检查其值之类的操作len。
string
len