- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我交叉了一段使用 .(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)
被称为 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/
Feel free to skip straight to TL/DR if you're not interested in details of the question 简短的序言: 我最近决定
我一直在阅读 A Tour of Go学习Go-Lang到目前为止一切顺利。 我目前在 Struct Fields类(class),这是右侧的示例代码: package main import "fm
Last time I got confused顺便说一下PowerShell急切地展开集合,基思总结了它的启发式如下: Putting the results (an array) within a
我是一名优秀的程序员,十分优秀!