Go (数据类型)方法调用/执行什么操作?
我遇到了一段使用Go (数据类型)方法调用/执行什么操作?,go,Go,我遇到了一段使用(string)方法的代码。由于不知道这叫什么,我很难找到它 以下是我试图理解它的原因: package main import "fmt" import "reflect" func main(){ var b interface{} b = "silly" fmt.Println(reflect.TypeOf(b.(string))) // we know that b
(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
确实是一个字符串,这可以用来告诉编译器某个变量是某种类型的。我的理解正确吗
b.(字符串)
称为a。如中所述:
类型断言接受接口值并从中提取指定显式类型的值
因此,是的,从类型断言中获得的值不是接口值,而是显式类型。您还可以通过添加非类型化布尔值来测试类型断言是否成功:
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前面的答案是正确的。但我认为这更像是在实践中发生的事情。在开关的情况下,(type)语法通常与类型名一起使用。在本例中,I(整数表达式)、B(布尔表达式)和Bop(二进制运算)是类型名
func commute (e Expr) (r Expr, d bool) {
switch exp:= e.(type) {
case I: r,d = exp,false
case B: r,d = exp,false
case Bop: r,d = Bop{exp.op, exp.right, exp.left},true
default: r,d = e,false
}
return
}
这不像C类型转换那样不安全,因为在case语句中,您保证具有匹配的类型。在阅读频道时,我经常会看到这一点,频道的类型是所有案例都实现的接口。非常有用。谢谢。一个更好的例子是将其与开关一起使用。Go在任何地方都使用带有开关的类型断言,这样您就可以传递未知类型的内容,而不会发现自己正在处理一个不正确的强制转换对象。@Rob如果您觉得缺少一个好的示例,请在回答中随意添加它。是一个独立的概念和结构。让前者使用x.(type)
语法,而不是(比如)使用typeof(x)
,这只是一个任意的(但很好的)设计选择。