.(data_type) 方法究竟是做什么的?

我来了一个交叉使用.(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发生在运行时,while.(string)会告诉编译器b确实是一个字符串,这可用于告诉编译器某个变量是某种类型。我的理解对吗?


Smart猫小萌
浏览 200回答 2
2回答

慕沐林林

b.(string)称为类型断言。正如Effective Go 中所写:类型断言采用接口值并从中提取指定显式类型的值。因此,是的,您从类型断言中获得的值不是接口值,而是显式类型。您还可以通过添加一个无类型的布尔值来测试类型断言是否成功:s, ok := b.(string) // s is of type stringif !ok {    // b did not contain a value of type string!}编辑:进一步解释以消除任何可能的误解:类型断言不会像您建议的那样“告诉 Go b 是一个字符串”。它的作用是,在运行时,它会尝试从 中提取字符串b,如果b包含其他类型,则恐慌(除非分配可选的 bool 值)。您从断言中获得的值确实是 type string,允许您执行切片(您不能对接口值进行切片)或检查其len.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go