我正在编写一个我需要在我的程序的其他部分使用的库,为此我不得不使用很多接口(interface),我最终遇到了一个我不知道如何解决的情况。
这是我的代码:
主.go
package main
import (
"test/bar"
)
// Foo is defined in another package
type Foo struct {
WhatWeWant string
}
func (f *Foo) getResult() interface{} {
return f.WhatWeWant
}
func newFoo() interface{} {
return &Foo{
WhatWeWant: "test",
}
}
func main() {
bar := bar.Bar{
NewFooer: newFoo,
}
bar.Execute()
}
酒吧/酒吧.go
package bar
import (
"fmt"
"reflect"
)
type myInterface interface {
getResult() interface{}
}
type Bar struct {
NewFooer func() interface{}
}
func (b *Bar) Execute() {
foo := b.NewFooer()
// executeLib only accept pointer
executeLibWrapper(foo)
whatWeWant := foo.(myInterface).getResult()
fmt.Println(whatWeWant)
fmt.Println("Win!")
}
// This function is executed in an external library I have no control on
func executeLibWrapper(src interface{}) {
executeLib(reflect.TypeOf(src))
}
func executeLib(src reflect.Type) {
if src.Kind() == reflect.Ptr {
executeLib(src.Elem())
return
}
switch src.Kind() {
case reflect.Struct:
fmt.Println("Struct OK!")
default:
panic(fmt.Sprintf("Can't detect struct, we detect %s", src.Kind()))
}
}
我得到了错误
panic: interface conversion: *main.Foo is not bar.myInterface: missing method getResult
我的目标是能够在执行库后调用 getResult()。 这是一个 Playground :https://play.golang.org/p/7G2wc6uGngH .这个 playground 有效,所以问题很可能来自于它在不同的包中。
请注意,我需要将指针传递给 executeLib,我无法在 execute() 中获取指针,否则我将丢失 foo 类型并且无法执行库:https://play.golang.org/p/A8ETfuMQyQB .这就是为什么我必须在 newFoo() 中返回指针
感谢您的帮助!
最佳答案
得到结果here .希望这能有所帮助。
似乎诀窍就是使用这些。添加这些片段对代码的影响最小。
只需将NewFooer 设为Bar 的成员函数即可。当 NewFooer 被调用时 newFoo 被调用。
func (m *Bar) NewFooer() interface{} {
return newFoo()
}
最终这个片段也被调用
func newFoo() interface{} {
return &Foo{
WhatWeWant: "test",
}
}
关于Golang,带指针和接口(interface)的用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49937113/
1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,
>>a=5=>5>>b=a=>5>>b=4=>4>>a=>5如何将“b”设置为实际的“a”,以便在示例中,变量a也将变为4。谢谢。 最佳答案 classRefdefinitializeval@val=valendattr_accessor:valdefto_s@val.to_sendenda=Ref.new(4)b=aputsa#=>4putsb#=>4a.val=5putsa#=>5putsb#=>5当您执行b=a时,b指向与a相同的对象(它们具有相同的object_id).当你执行a=some_other_thing时,a将指向
我一直在研究ruby的并行/异步处理能力,并阅读了许多文章和博客文章。我查看了EventMachine、Fibers、Revactor、Reia等。不幸的是,我无法为这个非常简单的用例找到简单、有效(且非IO阻塞)的解决方案:File.open('somelogfile.txt')do|file|whileline=file.gets#(R)ReadfromIOline=process_line(line)#(P)Processthelinewrite_to_db(line)#(W)WritetheoutputtosomeIO(DBorfile)endend你看到了吗,我的小脚本正
我一直在为使用acts_as_list的模型实现一些不错的交互界面,这些界面可以对我的mRails应用程序中的列表进行排序。我有一个排序函数,在每次拖放之后使用sortable_elementscript.aculo.us函数调用并设置每条记录的位置。这是在拖放完成后处理排序的Controller操作示例:defsortparams[:documents].each_with_indexdo|id,index|Document.update_all(['position=?',index+1],['id=?',id])endend现在我正在尝试对嵌套集模型(acts_as_nested
最近在工作中,看到一些新手测试同学,对接口测试存在很多疑问,甚至包括一些从事软件测试3,5年的同学,在聊到接口时,也是一知半解;今天借着这个机会,对接口测试做个实战教学,顺便总结一下经验,分享给大家。计划拆分成4个模块跟大家做一个分享,(接口测试、接口基础知识、接口自动化、接口进阶)感兴趣的小伙伴记得关注,希望对你的日常工作和求职面试,带来一些帮助。注:文章较长有5000多字,希望小伙伴们认真看完,当然有些内容对小白同学不是太友好,如果你需要详细了解其中的一些概念或者名词,请在文章之后留言,后续我将针对大家的疑问,整理输出一些大家感兴趣的文章。随着开发模式的迭代更新,前后端分离已不是新的概念,
我需要在MiniTest中的所有测试中的每个测试之前运行代码。在我做之前:MiniTest::Unit::TestCase.add_setup_hookdo...codetorunbeforeeachtestend在我将MiniTest升级到4.7.2版本后,它显示以下错误:undefinedmethod`add_setup_hook'forMiniTest::Unit::TestCase:Class(NoMethodError)我正在使用RubyMRI2.0.0p0。解决方案moduleMyMinitestPlugindefbefore_setupsuper#...codetorun
我读了http://www.padrinorb.com/guides/application-helpers但我不清楚每个View助手的用例是什么。具体来说,content_for/yield_content、render/partial、capture_html和concat_content如何组合在一起?现在我一直在我的Controller中使用render'my/view'并在'my中加入一些=partial'my/partial'/view'只是为了将主模板文件分解成更小的block。这是正确的做法吗?我想在何时何地使用其他辅助函数? 最佳答案
我对Ruby中的对象分配和指针有点困惑,编写了这段代码来测试我的假设。classFooattr_accessor:one,:twodefinitialize(one,two)@one=one@two=twoendendbar=Foo.new(1,2)beans=barputsbarputsbeansbeans.one=2putsbarputsbeansputsbeans.oneputsbar.one我曾假设,当我将bar分配给beans时,它会创建该对象的副本,并且修改一个不会影响另一个。唉,输出显示不是这样。^_^[jergason:~]$rubytest.rb####22我相信这些
我正在使用Gosugem进行一些图形编程。问题是,当我创建一个窗口时,我的鼠标指针被隐藏了。我可以猜到鼠标在某个时刻的位置,我可以凭直觉点击,但我的用户可能不会。如何显示指针? 最佳答案 如果你想使用系统光标你可以这样做classWindow查看libgosu的文档RubyGosurdocReference/Window 关于ruby-为什么Gosu隐藏我的鼠标指针?,我们在StackOverflow上找到一个类似的问题: https://stackoverf
我正在尝试在我的Rails应用程序中使用模型来从外部API检索信息。我想做的是以类似于ActiveRecord模型提供的方式(特别是关联,以及相同风格的可链接查询方法)访问我的数据模型(可能包含来自多个API调用的信息)。我最初的直觉是重新创建我想要的ActiveRecord部分并合并此API。不想“重新发明轮子”并确切地看到添加更多功能需要多少工作让我退后一步并重新评估如何处理这个问题。我找到了在没有表的情况下使用ActiveRecord的方法(请参阅:Railscast#193TablelessModel和博客文章here)并研究了ActiveRecord。因为ActiveMode