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)
,这只是一个任意的(但很好的)设计选择。