1 回答

TA贡献1856条经验 获得超5个赞
(稍微简化一下。
您有一个具有以下签名的函数:
func addOrUpdateRepositories(v interface{})
然后你这样称呼它:
repository := new(types.Repository)
addOrUpdateRepositories(repository)
就像这样:
repositories := make([]*types.Repository, 0)
addOrUpdateRepositories(repositories)
在第一次调用中,存储的值的具体类型将是(作为返回指向分配值的指针),在第二次调用中,存储的值的具体类型将是 - 因为这是被告知要创建的内容。v*types.Repositorynewv[]*types.Repositorymake
现在,您在 上执行类型开关,其内容为:v
switch x := v.(type) {
case map[string]*types.Repository:
case map[string][]*types.Repository:
case nil:
default:
}
撇开以下情况不谈:如果您不将其称为传递 a,则不会在问题的代码段中发生,则 将始终选择默认分支,因为存储在 中的具体值的类型是 never 或 。addOrUpdateRepositoriesnilvswitchvmap[string]*types.Repositorymap[string][]*types.Repository
我不确定为什么你没有看到这一点,所以也许你应该完善你的问题,或者可能试图在评论我的答案时澄清你的困惑?
另一个黑暗中的镜头:类型转换(请注意,Go没有类型转换,正如@Flimzy指出的那样)和Go中的类型切换实际上并没有改变它们所操作的值的基础表示形式 - 除了有限的一组(“每个人都期望如此”)情况,例如类型转换为a到,这些情况被精确地记录下来。float64int64
因此,您不能获取一个(指向类型值的一部分指针)并以某种方式强制它“成为”:由于多种原因,这将是一件荒谬的事情,最明显的是:如果您正在编写Go编译器,您将如何执行这样的“类型转换”?假设您真的要分配一个地图,但是应该为该地图中的哪个键分配原始(源)切片?将 a 类型转换为 ?[]*types.Repositorytypes.Repositorymap[string][]*types.Repository[]*types.Repositorystruct {foo []*types.Repository; bar []*types.Repository}
- 1 回答
- 0 关注
- 103 浏览
添加回答
举报