关于go的方法调用
1. 运行环境
go version go1.17.3 darwin/amd64
//: <> (当前使用的Go
版本,及系统版本、系统架构?)
//: <> (使用go version
命令查看,期望的结果如:go 1.12, linux/amd64
)
2. 问题描述?
var sampleMap = map[string]interface{}{
"CreateBucketSample": sample.CreateBucketSample,
"NewBucketSample": sample.NewBucketSample,
}
func main() {
sampleMap["CreateBucketSample"].(func())()
}
对于以上代码, sampleMap[“CreateBucketSample”] 实际获取到的是一个function, 后面的.(func())()就可以直接运行获取到的function
//: <> (代码问题的话,请提供一份最短的,可复现代码。或相关代码。)
3. 您期望得到的结果?
官网的文档中写了方法表达式的语法, 是f(t)这种, 上面直接.一个匿名函数并立即运行, 为什么能使sampleMap[“CreateBucketSample”] 立即运行呢?
4. 您实际得到的结果?
不理解这种调用情况
//: <> (有报错信息的话把堆栈信息提供出来)
func()
是一个类型sampleMap["CreateBucketSample"]
得到的值类型为interface{}
,而.()
则是类型断言,可以通过判断变量是否可以转换成某一个类型,所以.(func())
就是判断是否能转换为func()
类型。建议
.()
类型断言最好采用带返回是否成立的断言语法,即s, ok := x.(T)
,不然一旦无法转换类型,会发生panic
。