jjzjj

reflection - 戈朗 : how to use interface{} type to insert a value into the middle of a slice?

coder 2023-06-27 原文

我很难理解 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
}

我希望该函数能够为 arval 接受 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 内置 copy
  • reflect.Append 附加到 slice Value
  • (reflect.Value).Set(reflect.Value) 设置可设置元素的值(例如,您从 slice 中获取的东西)。
  • reflect.Appendreflect.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/

有关reflection - 戈朗 : how to use interface{} type to insert a value into the middle of a slice?的更多相关文章

  1. ruby-on-rails - 如何在数据库中反射(reflect) Ruby on Rails 中新的 belongs_to 和 has_many 关系 - 2

    我是Rails的新手(通常是Python专家),只是为了好玩而尝试构建一个简单的任务管理器应用程序。我正在使用Devise进行身份验证,并且有一个我试图与用户关联的任务对象。我已将以下内容添加到任务模型中:classTask并且我在我的Devise用户模型中添加了以下内容:classUser>end每当我添加此信息时,我都会运行:rakedb:migrate。然后它给了我一个错误,当我试图用它做任何事情时,user_id的数据库字段不存在。我确信这是我所缺少的相当简单的东西。感谢您的帮助。 最佳答案 向模型添加belongs_to(

  2. ruby-on-rails - Rails 控制台 : reload! 没有反射(reflect)模型文件的变化?可能是什么原因? - 2

    之前它运行良好。我一直在玩一点配置。所以可能是我在不知不觉中更改了一些配置。这里是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

  3. javascript - innerHTML 替换不反射(reflect) - 2

    我有这样的HTMLone当我使用document.getElementById('foo').innerHTML=document.getElementById('foo').innerHTML.replace("one","two");innerHTML被替换,但它没有反射(reflect)在浏览器中。如果我提醒innerHTML,我可以看到它现在已被更改,但在浏览器中它仍然显示旧选项。有没有办法让浏览器识别这个更改?提前致谢。 最佳答案 我在Firefox3.5中工作正常WorkingDemo编辑:您必须使用IE。您需要创建一个

  4. javascript - 范围变量以 Angular 更新,但更改未反射(reflect)给用户 - 2

    我有一些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知道变化

  5. javascript - 如何在 typescript 中导入/使用 Reflect - 2

    我正在尝试使用thisSOanswer中的代码.它使用反射。这是一个副本:exportfunctionCustomComponent(annotation:any){returnfunction(target:Function){varparentTarget=Object.getPrototypeOf(target.prototype).constructor;varparentAnnotations=Reflect.getMetadata('annotations',parentTarget);varparentAnnotation=parentAnnotations[0];Obj

  6. javascript - DOM 中反射(reflect)的同名表单元素 - 2

    如果您在一个表单中有多个具有相同name的表单元素,则表单上elements集合中的条目最终将成为这些字段的集合(很方便)。DOM2HTML规范coverstheelementscollection但当有多个同名字段时似乎不会立即指定此行为。该行为是否包含在标准中(在DOM2HTML规范或其他规范中的其他地方)?为清楚起见,我并不是在询问访问这些字段的最佳方式是什么。我想问的是,它们最终出现在elements集合的集合(各种类型)中这一事实是否包含在标准中,如果是,是哪一个。示例(livecopy):HTML:JavaScript:varform=document.getElement

  7. javascript - 获取变量名。 javascript "reflection" - 2

    有没有办法获取变量name,就像您在.Net中通过反射所做的那样?就像在这种情况下:function(x,y,z){if(x===0)logger.log('variable'+x.reflectedName'hasinvalidvalue'+x)//logs:'variablexhasinvalidvalue0)...}我发现了类似的问题,想要函数之外的var名称(?!),但找不到这个问题。(jQuery是一个选项,虽然我不知道如何用它来完成......) 最佳答案 实际上你可以。这是一个片段:functiongetVarName

  8. javascript - 范围变量值的变化没有反射(reflect)在我的字符串中 - 2

    我有以下字符串:"/root/get";现在我在上面的字符串中生成一个带有1个范围变量的查询字符串,但问题是当该变量的值发生变化时,新值不会自动在我的URL中更新。您可以在下面的演示中看到我有2个按钮更新和检查。在更新中,我生成了查询字符串,并在检查按钮上更新了范围变量的值,但这并没有反射(reflect)在我的URL中。我不明白为什么会这样。在不调用generateQueryParameters方法的情况下单击复选按钮时的预期输出:/root/get?no=2varapp=angular.module("myApp",[]);app.controller("myController"

  9. javascript - 输入的动态修改值未反射(reflect)在 DOM 中 - 2

    如何让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

  10. javascript - ES6 Reflect API 的好处 - 2

    我一直致力于升级一些代码以使用ES6语法。我有以下代码行:deletethis._foo;我的linter提出了一个使用建议:Reflect.deleteProperty(this,'_foo');您可以找到此方法的文档here.MDN文档声明:TheReflect.deletePropertymethodallowsyoutodeleteapropertyonanobject.ItreturnsaBooleanindicatingwhetherornotthepropertywassuccessfullydeleted.Itisalmostidenticaltothenon-stri

随机推荐