一尘不染

。(data_type)方法究竟调用/做什么?

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 
                                            // is a string                     
                                            // at compile time

    fmt.Println(reflect.TypeOf(b))          // we do not

}

结果:

string
string

但是,我认为这reflect.TypeOf是在运行时发生的,它.(string)会告诉编译器b确实是一个字符串,并且可以用来告诉编译器变量是某种类型的。我的理解正确吗?

游乐场


阅读 236

收藏
2020-07-02

共1个答案

一尘不染

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

2020-07-02