在链接的 Playground 示例中,我定义了一个类型:
type DoMap map[int]func(Doer) string
Doer 在我定义的接口(interface)类型中。
我在具体类型 MyDoer 上实现接口(interface)。我希望能够构造一个 DoMap,其中该映射中的条目包含如下两个函数:
func(Doer) string // this works
func(*MyDoer) string // this doesn't
func(MyDoer) string // more-or-less the same idea, also doesn't
我不能,虽然很明显它们是不同的类型,但我想知道为什么我不能,因为函数确保我必须提供一个实现 Doer 的 MyDoer .
这还不足以确保我履行与职能部门的契约(Contract)吗?
还有其他方法可以实现吗?
https://play.golang.org/p/sJ2Rg3neL7
有些注释的形式是“它们不同”“那是规范”,但我可以将 MyDoer 传递给接受 Doer 的函数 - 如果接口(interface)已实现:为什么将其放入 map 会改变结果?
有人要求解释“真正的问题”,还有一个问题是为什么我不能只使用类型映射。我会尽我所能:
DoMap 不能是类型映射。我正在编写一个库,它允许开发人员根据接受开发人员定义的类型(业务消息)的开发人员编写的函数(业务逻辑)的输出,简洁地定义状态机,这些状态机成功或失败。图书馆的存在是为了确保一系列的转变可以在别处进行序列化和记录,随后由图书馆的第三方用户进行验证。我最初并没有说所有这些,因为它没有捕获要点 - 没有一个简单的答案。
现在我觉得我的无礼问题惹恼了每个人,而且由于我在快速拨号上没有 Rob Pike,我可能会删除它,除非有人愿意相信我需要做什么我需要做些什么,并提出一些建议。
最佳答案
您还没有概述具体问题(原因)。这使得很难提出替代方案,因为看起来您正在尝试重新创建另一种语言。
按照优先顺序,您可以按预期使用类型系统:
type DoMap map[int]func(Doer) string
type Doer interface {
Do() int
AlsoDo() int
}
https://play.golang.org/p/uPzoOZiLQG
或者你当然可以绕过类型系统:
type DoMap map[int]interface{}
https://play.golang.org/p/lfKPkwhOGa
但我不建议这样做 - 最好使用语言为您提供的工具,而不是试图让它们变形。
接口(interface)的目的是宣传关于功能的契约(Contract)——他们需要他们的论据,仅此而已。但是你也想在参数上调用 AlsoDo,所以如果你想这样做,把它放在契约(Contract)中。然后一切都会按您的意愿工作。该函数的契约(Contract)应该在您的示例中的函数旁边发布,它应该在您的控制之下。
[编辑] 最后,如果您不控制传入的类型,也许您应该重新考虑 map 的想法。它可以是一个 map[int]Doer,其中 Doer 是一个接口(interface)(你应该控制它)。这让你可以在你的库中宣传你需要的东西,用户可以把他们想要的任何类型放在那里(以及他们想要的任何其他依赖项)。
// Library
type DoMap map[int]Doer
type Doer interface {
Do() int
}
// Client
type MyDoer struct {
myint int
}
func (d *MyDoer) Do() int {
fmt.Println(d.AlsoDo())
return d.myint + 1
}
func (d *MyDoer) AlsoDo() int {
return d.myint + 2
}
https://play.golang.org/p/cs01C8bSKo
[EDIT2] 最后的编辑,如果构建一个 fsm 管理链,您可能会发现这个小项目很有启发性。它绝对应该是可行的,没有太多麻烦,只是与您第一次尝试可以采用任何类型的函数映射不完全一样:
关于dictionary - 戈朗 : Using a defined interface in a Map Value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46433860/
我需要编写一个Ruby方法,它接受一个词,通过OS10.5的Dictionary.app的同义词库函数运行它,并返回备选词。如果Ruby方法最终调用命令行,那很好;我只需要能够从Ruby以编程方式完成它。查看RubyOSA后,我意识到可以通过某些词典服务访问词典[http://discussions.apple.com/thread.jspa?threadID=1561332],但我真的不明白。有人看到一个简单的解决方案吗?我也准备制作一个Automator工作流程并从命令行调用它,但由于某种原因我无法从shell中正确地为“获取定义”函数提供一个词(它一直说它不能'找到这个词,但是当
我正在尝试使用node.js验证JSON对象。基本上,如果存在条件A,那么我想确保某个特定值位于可能不存在的数组中。我在python中使用dictionary.get执行此操作,因为如果我查找不存在的内容,它将返回默认值。这是它在python中的样子ifoutput.get('conditionA')andnot'conditionB'inoutput.get('deeply',{}).get('nested',{}).get('array',[]):print"Thereisanerrorsomewhereyouneedtobefixing."我想为javascript找到类似的技术
我正在尝试使用JSON.net来序列化字典。使用JsonConvert.SerializeObject(theDict);这是我的结果{"1":{"Blah1":false,"Blah2":false,"Blah3":"None","Blah4":false},"2":{"Blah1":false,"Blah2":false,"Blah3":"None","Blah4":false},"3":{"Blah1":false,"Blah2":false,"Blah3":"None","Blah4":false},.........}有没有办法序列化这个字典,以便将键呈现为有效的javasc
已解决ValueError:dictionaryupdatesequenceelement#0haslength1;2isrequired文章目录报错问题报错翻译报错内容解决方法千人全栈VIP答疑群联系博主帮忙解决报错报错问题粉丝群里面的一个小伙伴,想用Python爬虫然后解析数据,但是发生了报错(当时他心里瞬间凉了一大截,跑来找我求助,然后顺利帮助他解决了,顺便记录一下希望可以帮助到更多遇到这个bug不会解决的小伙伴),报错代码如下所示:defspider(page=1):""":parampage::return:"""url="http://www.ceic.ac.cn/ajax/sea
我正在尝试将键值映射转换为成对slice,例如给定如下映射:m:=make(map[int64]int64)m[521]=4m[528]=8我如何将其转换成其条目的一部分,例如:[[521,4],[528,8]]我正在考虑遍历所有这些键值然后为其创建slice,但是是否有任何简单的代码可以做到这一点? 最佳答案 packagemainimport"fmt"funcmain(){//createamapm:=map[int64]int64{512:8,513:9,234:9,392:0}//createaslicetoholdrequ
关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭3年前。Improvethisquestion告诉我如何使用Golang登录网站。下载xls文件是得到了,但是为了在Excel表格中有数据,需要登录网站。该站点位于公司的服务器上。如果你能告诉你怎么做。例如,我用来执行此操作的VBA代码。SetoFields=CreateObject("Scripting.Dictionary")WithoFields.Add"login","sdiscor".Add"password","sdiscor"EndWi
下面是我查询的代码:我有一个单维数组a当我打印a[0][0]时,我不明白为什么它返回字符a的ascii值:packagemainimport("fmt")funcmain(){a:=[3]string{"a","b","c"}fmt.Println(a[0][0])}输出:97 最佳答案 下面是如何打印ascii的代码示例a:=[3]string{"a","b","c"}for_,rune:=rangea{fmt.Println(rune)//Itwillprinta,b,c}因为你在你的代码中使用了[0][0],所以它是等价的fo
我有一个复杂的json格式字符串,我想将其转换为golang中的map。假设字符串是species:{"type":"human""age":"23""attributes":{"height":"182""weight":"160""contact":{"address":########"phone":#########}}}我如何解析它使得map[attributes]又是一个map[string]接口(interface)等等? 最佳答案 您可以使用map[string]interface{},例如:species:=mak
我的cookie中存储了一张map,如下所示:cookieData:=map[expiration:1533455712ip:[hash:dd363d13234566727743277e96email:user@user.com]fmt.Println(reflect.TypeOf(cookie))>>map[string]string有人可以帮助我了解如何从这张map中只获取电子邮件值吗?提前致谢。 最佳答案 golang中的类型转换是通过附加.(T)完成的ip:=cookieData["ip"].(map[string]stri
typepath[]bytefunc(ppath)ToUpper(){fori,b:=rangep{if'a'在上面(这个例子是从“TheGoBlog”复制过来的),如果ToUpper变成这样:func(ppath)ToUpper(){fori,_:=rangep{if'a'哪个会更有效率为什么?“TheGoBlog”对前一个说:“这里的ToUpper方法在forrange构造中使用两个变量来捕获索引和slice元素。这种形式的循环避免了在主体中多次写入p[i]。”什么意思? 最佳答案 前者有更多的内存操作,即在b上:它在循环的第一