草庐IT

interface - slice (从有限数量的接口(interface)中选择一个)

如何让RemoveDead函数接受实现Liver的其他接口(interface)片段(甚至可能是结构指针片段),同时对性能影响很小?在我看来,该函数必须将interface{}作为参数并进行运行时转换,但我不确定如何进行转换。我还猜测执行x.(Liver)比Liver(x)慢很多,因为后者是编译时转换。复制粘贴函数并在每个副本中更改参数和返回类型是最好的解决方案吗?只需要三到四个副本,但这仍然是一个非常笨拙的解决方案。typeUpdaterinterface{LiverUpdate()bool}typeLiverinterface{Alive()bool}funcRemoveDead(

使用包含 slice 的结构时 xml 恶作剧?

我尝试了以下代码以了解为什么我在golang中遇到xml问题。据我了解,我应该能够编码一个结构,然后将结果数据解编回相同类型的结构?我期望的结果是一个包含子片的父结构,而不是子片为零?playgroundlinkpackagemainimport("encoding/xml""fmt")typeParentstruct{XMLNamexml.Name`xml:"parent"`Children[]Child`xml:"children"`}typeChildstruct{XMLNamexml.Name`xml:"child"`IDint`xml:"ID"`}funcmain(){chi

戈朗 : How to change struct field value in slice of interfaces

Playground问题:https://play.golang.org/p/UKB8f4qGsM我有一部分接口(interface),我很确定它们有哪种类型(实际上我不知道,所以我必须输入switch它,但为了清楚起见我把它留了下来)。如何为接口(interface)后面的结构中的字段赋值?类型断言似乎带走了引用。我也尝试过使用指针,但它也不起作用,主要是因为我无法键入assert然后(类型*inter不能被类型断言)并且当我取消引用它时,它甚至变得毫无意义。..我在Go方面没有那么丰富的经验,如果能得到任何帮助,我将不胜感激。 最佳答案

go - 在保留顺序的同时对 slice 进行并发反序列化

当前代码结构:funcdoStuff(serializeds[]string)([]*MyStruct,error){objs:=[]*MyStruct{}for_,s:=rangeserializeds{deserializedObject,ok,err:=doDeserialization(s)iferr!=nil{//ifanyerr,abandonthewholethingreturnnil,err}if!ok{continue}objs=append(objs,deserializedObject)}returnobjs,nil}序列化数通常一次包含200-1000个序列化字

go - 为什么追加不适用于 slice ?

这个问题在这里已经有了答案:Valuereceivervs.pointerreceiver(3个答案)MyobjectisnotupdatedevenifIusethepointertoatypetoupdateit(3个答案)关闭6个月前。我不明白为什么下面的代码不起作用:typeWriterinterface{Write(input[]byte)(int,error)}typeresultReceiverstruct{body[]byte}func(rrresultReceiver)Write(input[]byte)(int,error){fmt.Printf("received

go - 遍历 slice 并重置索引 - golang

我正在golang中迭代一个slice并一个一个地挑选元素。我遇到的问题是,在我删除一个项目后,我应该重置索引或从头开始,但我不确定如何。packagemainimport("fmt")funcmain(){x:=[]int{1,2,3,7,16,22,17,42}fmt.Println("Wewillstartoutwith",x)fori,v:=rangex{fmt.Println("Thecurrentvalueis",v)x=append(x[:i],x[i+1:]...)fmt.Println("Andafteritisremoved,weget",x)}}将返回以下内容:W

go - strings.Split,标准输入不返回 slice/数组

似乎strings.split("")没有返回数组。我不知道这是为什么。我确定我在其他地方的类似上下文中使用它。packagemainimport("fmt""strconv""strings")funcmain(){varseedCostfloat64varlawnNointvarinstringvarareafloat64varwh[]stringfmt.Scanln(&seedCost)//2isinputtedfmt.Scanln(&lawnNo)//3lawnCost:=0.00fori:=0;i 最佳答案 这是因为fmt

json - Golang Unmarshal slice 类型接口(interface)

在此示例中,我将尝试加载包含多边形的2D场景。在代码中,我会有许多不同的结构,例如Circle、Square、Rectangle、Pentagon等。所有这些都将共享共同的功能,例如面积和周长。场景本身将存储为界面多边形的一部分。这是我用来测试的代码:packagemainimport("encoding/json""fmt""math")typePolygoninterface{Area()float32}typeRectanglestruct{Basefloat32`json:"base"`Heightfloat32`json:"height"`Xfloat32`json:"x"`

戈朗 : accessing value in slice of interfaces

我有一个数据结构,看起来像这样:([]interface{})(len=1cap=1){(string)(len=1938)"value"}它是类型[]interface{}如何使用fmt打印此value,或以某种方式访问​​它以便我可以使用它。 最佳答案 您可以将类型断言或反射与通用接口(interface){}一起用于底层类型。如何执行此操作取决于您的特定用例。如果您希望interface{}成为示例中的[]interface{},您可以:ifsl,ok:=thing.([]interface{});ok{for_,val:=r

go - 了解 Go 中的 slice 分配

在下面的代码片段中,ifblock之后的行到底在做什么slice=slice[0:l+len(data)]?funcAppend(slice,data[]byte)[]byte{l:=len(slice)ifl+len(data)>cap(slice){//reallocate//Allocatedoublewhat'sneeded,forfuturegrowth.newSlice:=make([]byte,(l+len(data))*2)//Thecopyfunctionispredeclaredandworksforanyslicetype.copy(newSlice,slice)