[英]What exactly does .(data_type) method called/do?
我遇到了使用.(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
确实是一个字符串,这可以用来告诉编译器变量是某种类型的。 我的理解正确吗?
类型声明使用接口值,并从中提取指定显式类型的值。
因此,是的,您从类型断言中获得的值不是接口值,而是显式类型。 您还可以通过添加无类型的布尔值来测试类型断言是否成功:
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(整数expr),B(bool expr)和Bop(二进制op)是类型名称。
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语句中可以确保您具有匹配的类型。 在阅读通道时,我会看到很多,其中通道的类型是所有情况都实现的接口。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.