gpt4 book ai didi

go - .(data_type) 方法究竟调用/做什么?

转载 作者:IT王子 更新时间:2023-10-29 02:25:07 26 4
gpt4 key购买 nike

我交叉了一段使用 .(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 是实际上是一个字符串,这可以用来告诉编译器一个变量是某种类型的。我的理解对吗?

goplayground

最佳答案

b.(string) 被称为 type assertion 。如 Effective Go 中所写:

A type assertion takes an interface value and extracts from it a value of the specified explicit type.

所以,是的,您从类型断言中获得的值不是接口(interface)值,而是显式类型。您还可以通过添加未类型化的 bool 值来测试类型断言是否成功:

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 值),则会出现 panic .

你从断言中得到的值确实是 string 类型,允许你做一些事情,比如 slice (你不能 slice 接口(interface)值)或检查它的 len.

关于go - .(data_type) 方法究竟调用/做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28946086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com