关于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. 您期望得到的结果?

关于go的方法调用
官网的文档中写了方法表达式的语法, 是f(t)这种, 上面直接.一个匿名函数并立即运行, 为什么能使sampleMap[“CreateBucketSample”] 立即运行呢?

4. 您实际得到的结果?

不理解这种调用情况
//: <> (有报错信息的话把堆栈信息提供出来)

go
最佳答案

func() 是一个类型

sampleMap["CreateBucketSample"] 得到的值类型为 interface{},而.()则是类型断言,可以通过判断变量是否可以转换成某一个类型,所以.(func()) 就是判断是否能转换为func()类型。

建议.()类型断言最好采用带返回是否成立的断言语法,即s, ok := x.(T),不然一旦无法转换类型,会发生panic

1周前 评论
StoneZzz (楼主) 1周前
caijunduo (作者) 1周前
讨论数量: 4

.(func()) 是在做类型转换,并不是执行匿名函数

1周前 评论

func() 是一个类型

sampleMap["CreateBucketSample"] 得到的值类型为 interface{},而.()则是类型断言,可以通过判断变量是否可以转换成某一个类型,所以.(func()) 就是判断是否能转换为func()类型。

建议.()类型断言最好采用带返回是否成立的断言语法,即s, ok := x.(T),不然一旦无法转换类型,会发生panic

1周前 评论
StoneZzz (楼主) 1周前
caijunduo (作者) 1周前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!