繁体   English   中英

。(data_type)方法到底调用/做什么?

[英]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确实是一个字符串,这可以用来告诉编译器变量是某种类型的。 我的理解正确吗?

游乐场

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

先前的答案是正确的。 但是我认为这更像是在实践中发生的事情。 在开关的情况下,。(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM