我很难理解 interface{} 类型在 Go 中的用法。
在这个例子中,我有一个函数可以将一个值插入到 slice 中间的某处。它看起来像这样:
type mystruct {
a, b, c int
}
func insert(ar []mystruct, val mystruct, i int) []mystruct {
l := len(ar)
if l == cap(ar) {
tmp := make([]mystruct, l + 1, (l * 2) + 1)
copy(tmp, ar[0:i])
copy(tmp[i+1:], ar[i:])
ar = tmp
} else {
ar = ar[0:l+1]
copy(ar[i+1:], ar[i:])
}
ar[i] = val
return ar
}
我希望该函数能够为 ar 和 val 接受 interface{} 以便我可以传递它 slice 和任何类型的值,它会毫无怨言地执行插入。
根据我目前所读的内容,我认为这应该通过 reflect 包来完成。我已经阅读了反射规则和各种关于反射和接口(interface){}的教程,但我不确定如何处理这个问题。我想尽可能地减少开销,我知道反射会使代码变慢一点,但最有效的方法是什么?
谢谢!
最佳答案
整个“grow if at capactiy”代码是不必要的;使用内置的 append——它会为你做这些。
将签名更改为:
func insert(ar interface{}, val interface{}, i int) interface{}
然后检查 ar 是否是一个 slice ,并且 ar 的元素类型与 val 的类型相同:
at, vt := reflect.TypeOf(ar), reflect.Typeof(val)
if at.Kind() != reflect.Slice {
panic(fmt.Sprintf("expected slice, got %T", at))
}
if at.Elem() != vt {
panic("first argument must be a slice of the second argument's type")
}
类型验证后,获取一些reflect.Value:
av, vv := reflect.ValueOf(ar), reflect.ValueOf(val)
然后使用例如:
(reflect.Value).Index(int) 访问 slice 的元素。reflect.Copy 复制到 slice 和从 slice 复制 à la 内置 copyreflect.Append 附加到 slice Value(reflect.Value).Set(reflect.Value) 设置可设置元素的值(例如,您从 slice 中获取的东西)。reflect.Append 或 reflect.AppendSlice 以内置 append 的方式附加到 slice 。一旦你有了代表结果 slice 的最终 reflect.Value;将其作为 interface{} 返回,如下所示:
return result.Interface()
关于reflection - 戈朗 : how to use interface{} type to insert a value into the middle of a slice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28514046/
我是Rails的新手(通常是Python专家),只是为了好玩而尝试构建一个简单的任务管理器应用程序。我正在使用Devise进行身份验证,并且有一个我试图与用户关联的任务对象。我已将以下内容添加到任务模型中:classTask并且我在我的Devise用户模型中添加了以下内容:classUser>end每当我添加此信息时,我都会运行:rakedb:migrate。然后它给了我一个错误,当我试图用它做任何事情时,user_id的数据库字段不存在。我确信这是我所缺少的相当简单的东西。感谢您的帮助。 最佳答案 向模型添加belongs_to(
之前它运行良好。我一直在玩一点配置。所以可能是我在不知不觉中更改了一些配置。这里是environment/development.rb的配置config.cache_classes=false#Logerrormessageswhenyouaccidentallycallmethodsonnil.config.whiny_nils=true#Showfullerrorreportsanddisablecachingconfig.consider_all_requests_local=trueconfig.action_view.debug_rjs=trueconfig.action_c
我有这样的HTMLone当我使用document.getElementById('foo').innerHTML=document.getElementById('foo').innerHTML.replace("one","two");innerHTML被替换,但它没有反射(reflect)在浏览器中。如果我提醒innerHTML,我可以看到它现在已被更改,但在浏览器中它仍然显示旧选项。有没有办法让浏览器识别这个更改?提前致谢。 最佳答案 我在Firefox3.5中工作正常WorkingDemo编辑:您必须使用IE。您需要创建一个
我有一些Angular变量设置如下:$scope.pane=[];$scope.pane.count=0;$scope.pane.max=5;然后我像这样在HTML中显示变量:{{pane.count}}这工作正常并按预期显示0。现在,如果我在任何时候更新变量,更新都会发生(我可以使用console.log看到)但HTML中的打印版本不会更新。例如setTimeout(function(){$scope.pane.count=1;},1000);我正在使用Angularv1.3。我做错了什么? 最佳答案 为了让angular知道变化
我正在尝试使用thisSOanswer中的代码.它使用反射。这是一个副本:exportfunctionCustomComponent(annotation:any){returnfunction(target:Function){varparentTarget=Object.getPrototypeOf(target.prototype).constructor;varparentAnnotations=Reflect.getMetadata('annotations',parentTarget);varparentAnnotation=parentAnnotations[0];Obj
如果您在一个表单中有多个具有相同name的表单元素,则表单上elements集合中的条目最终将成为这些字段的集合(很方便)。DOM2HTML规范coverstheelementscollection但当有多个同名字段时似乎不会立即指定此行为。该行为是否包含在标准中(在DOM2HTML规范或其他规范中的其他地方)?为清楚起见,我并不是在询问访问这些字段的最佳方式是什么。我想问的是,它们最终出现在elements集合的集合(各种类型)中这一事实是否包含在标准中,如果是,是哪一个。示例(livecopy):HTML:JavaScript:varform=document.getElement
有没有办法获取变量name,就像您在.Net中通过反射所做的那样?就像在这种情况下:function(x,y,z){if(x===0)logger.log('variable'+x.reflectedName'hasinvalidvalue'+x)//logs:'variablexhasinvalidvalue0)...}我发现了类似的问题,想要函数之外的var名称(?!),但找不到这个问题。(jQuery是一个选项,虽然我不知道如何用它来完成......) 最佳答案 实际上你可以。这是一个片段:functiongetVarName
我有以下字符串:"/root/get";现在我在上面的字符串中生成一个带有1个范围变量的查询字符串,但问题是当该变量的值发生变化时,新值不会自动在我的URL中更新。您可以在下面的演示中看到我有2个按钮更新和检查。在更新中,我生成了查询字符串,并在检查按钮上更新了范围变量的值,但这并没有反射(reflect)在我的URL中。我不明白为什么会这样。在不调用generateQueryParameters方法的情况下单击复选按钮时的预期输出:/root/get?no=2varapp=angular.module("myApp",[]);app.controller("myController"
如何让DOM反射(reflect)修改后的输入值?setInterval(function(){$('input').val(parseInt($('input').val())+1)console.log('div.html():',$('div').html())},1000) 最佳答案 尝试直接更改DOM。例如:setInterval(function(){varv=parseInt(document.getElementById("myInput").value)+1;document.getElementById("myI
我一直致力于升级一些代码以使用ES6语法。我有以下代码行:deletethis._foo;我的linter提出了一个使用建议:Reflect.deleteProperty(this,'_foo');您可以找到此方法的文档here.MDN文档声明:TheReflect.deletePropertymethodallowsyoutodeleteapropertyonanobject.ItreturnsaBooleanindicatingwhetherornotthepropertywassuccessfullydeleted.Itisalmostidenticaltothenon-stri