我遇到了一段使用过的代码.(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
}
Result:
string
string
不过,我认为reflect.TypeOf
发生在运行时,同时.(string)
会告诉编译器b
确实是一个字符串,这可以用来告诉编译器变量是某种类型。我的理解对吗?
去游乐场 https://play.golang.org/p/eTz3HXH3fc
b.(string)
被称为类型断言 https://golang.org/ref/spec#Type_assertions。正如所写有效的行动 https://golang.org/doc/effective_go.html#interface_conversions:
类型断言采用接口值并从中提取指定显式类型的值。
所以,是的,从类型断言中获得的值不是接口值,而是显式类型。您还可以通过添加无类型布尔值来测试类型断言是否成功:
s, ok := b.(string) // s is of type string
if !ok {
// b did not contain a value of type string!
}
Edit:
进一步解释以消除任何可能的误解:
类型断言不“告诉 Go b 是一个字符串”正如你所建议的。它的作用是在运行时尝试从b
,如果出现恐慌b
包含一些其他类型(除非分配可选的布尔值)。
从断言中获得的值确实是类型string
,允许您执行诸如切片(不能切片接口值)或检查其值之类的操作len
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)