为了账号安全,请及时绑定邮箱和手机立即绑定

戈莫克不能使用类型映射*mockFoo 作为映射[字符串]foo

戈莫克不能使用类型映射*mockFoo 作为映射[字符串]foo

Go
红糖糍粑 2022-10-04 19:22:56
我正在使用gomock,我有一段示例代码,我想测试一下。type StructA struct {  client map[string]Foo}type Foo interface {  foo.methodFoo() string}func (a *structA) MethodA(name string) string {  client := a.client[name]  return client.methodFoo()  }在我的测试中,我为 foo 生成了一个模拟,称为 mockFoo。使用模拟 v1.6.0 为接口 foo 生成模拟。我的测试代码为:func Test_MethodA(t *testing.T) {  type fields struct {    client map[string]*mockFoo  }  tests := []struct {    fields fields    want   string  }  {      // test cases  }  for _, tt := range tests {    t.Run(tt.name, func(t *testing.T) {      a := &StructA {        client: tt.fields.client //this has an error, saying that we cannot use map[string]*mockFoo as the type map[string]foo      }      ...    })  }}TLDR 是不能用作类型 。map[string]*mockFoomap[string]Foovar foo1 Foovar mockFoo1 *mockFoofoo1 = mockFoo1 // no problemvar fooMap map[string]Foovar mockFooMap map[string]*mockFoofooMap = mockFooMap // problematic我能知道我在这里是否做错了什么,或者这是否是预期的行为吗?谢谢。
查看完整描述

1 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

根据您的描述,是一个接口,并实现该接口。因此,每当需要 时,都可以使用 。Foo*mockFooFooFoo*mockFoo


类型 与 类型 不同。两者都是具体类型(它们不是接口),因此不能用一个替换另一个。map[string]Foomap[string]*mockFoo


但是,您可以使用 ,并将值放入该映射中,根据我从您的代码中看到的情况,这是您应该做的。将映射声明为 ,并在其中使用值。如果需要将映射的值引用为 ,则可以键入断言映射值以获取该值,即:map[string]Foo*mockFoomap[string]Foo*mockFoo*mockFoo*mockFoo


fooMap=map[string]Foo{}

fooMap["key"]=mockFoo1

...

value:=foomap["key"].(*mockFoo)


查看完整回答
反对 回复 2022-10-04
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号