草庐IT

go - 如何检查接口(interface){}是否是一个 slice

我是Go的菜鸟:)所以我的问题可能很愚蠢,但找不到答案,所以。我需要一个函数:funcname(vinterface{}){ifis_slice(){for_,i:=rangev{my_var:=i.(MyInterface)...dosmth}}else{my_var:=v.(MyInterface)...dosmth}}如何在Go中执行is_slice?感谢任何帮助。 最佳答案 在你的例子中是typeswitch是最简单方便的解决方案:funcname(vinterface{}){switchx:=v.(type){case[]

arrays - 如何在 golang 中从数组 unsafe.Pointer 创建数组或 slice ?

一个指向数组的指针,比方说:p:=uintptr(unsafe.Pointer(&array))size:=5我无法访问变量array,上面的代码是为了更清楚。此外,我知道数组的大小,但size不是常量,它会根据运行时而变化。现在,我想用已知的指针、大小,当然还有数据类型来初始化slice或数组。我想出了以下代码:data:=make([]byte,size)stepSize:=unsafe.Sizeof(data[0])fori:=0;i但是这种方法做的是内存拷贝,效率不高,有没有不做拷贝的方法?附言我也尝试了以下两种方法,//method1data:=*(*[]byte)(unsa

go - 如何在 go 中反转 slice ?

如何在Go中反转任意slice([]interface{})?我宁愿不必编写Less和Swap来使用sort.Reverse。有没有一种简单的内置方法可以做到这一点? 最佳答案 标准库没有用于反转slice的内置函数。使用for循环反转slice:fori,j:=0,len(s)-1;i在Go1.18或更高版本中使用类型参数编写通用反向函数:funcreverse[S~[]E,Eany](sS){fori,j:=0,len(s)-1;i使用reflect.Swapper在Go1.8或更高版本中编写适用于任意slice类型的函数:fu

go - 为什么奇数 slice 容量与偶数 slice 容量不同

我注意到当容量为奇数时,slice的容量表现不同。更具体地说:当一个元素被添加到slice中时,slice的容量在原始容量为偶数时加倍。但是当原始容量为奇数时,容量增加一然后增加一倍。示例:s:=make([]int,28,28)s=append(s,1)fmt.Println("len=",len(s),"cap=",cap(s))//len=len+1,cap=2*cappri:=make([]int,27,27)pri=append(pri,1)fmt.Println("len=",len(pri),"cap=",cap(pri))//len=len+1,cap=2*(cap+1

arrays - Go 中缺少数组/slice 协方差的任何明智解决方案?

我刚刚遇到的问题是在以下情况下该怎么办:funcprintItems(headerstring,items[]interface{},fmtStringstring){//...}funcmain(){variarr=[]int{1,2,3}varfarr=[]float{1.0,2.0,3.0}printItems("Integerarray:",iarr,"")printItems("Floatarray:",farr,"")}Go没有泛型,也不允许使用集合协变:prog.go:26:cannotuseiarr(type[]int)astype[]interface{}infunc

来自二维数组的 Golang slice 列?

我很好奇,如何从二维数组创建列slice?我有一个用于Tic-Tac-Toe游戏板的数组,我正在尝试创建一个列slice,但我的slice结果完全相同。/*Justtryingtogetrowsandcolumnsworkingfirst*/func()isWin()bool{win:=make([]char,SIZE*2)fori:=rangeBOARD{fmt.Println("Row")win[i]=check(BOARD[i][0:SIZE])fmt.Println("Column")win[i+SIZE]=check(BOARD[0:SIZE][i])}returnfalse

go - Golang 什么时候 append() 创建一个新的 slice ?

根据builtinapidocs,append()会在原slice的容量不够大时,重新分配并复制到一个新的数组block中。这是一个(简化版)递归算法,用于创建字母表(在本例中为bool值)的组合。字母表的成员(true、false)被递归地添加到slice中,直到它达到正确的长度,此时它通过channel发送。packagemainimport("fmt")funcAddOption(cchan[]bool,combo[]bool,lengthint){iflength==0{fmt.Println(combo,"!")cHere是此代码的Playground链接。在输出中:[tru

performance - append 到 slice 糟糕的性能.. 为什么?

我目前正在使用GoLang创建游戏。我正在测量FPS。我注意到使用for循环append到slice时会损失7fps,如下所示:vertexInfo:=Opengl.OpenGLVertexInfo{}fori:=0;i我正在为每个Sprite、每次绘制都这样做。问题是,为什么我只循环多次并将相同的东西append到这些slice中,性能就会受到如此巨大的影响?有没有更有效的方法来做到这一点?这不像我在添加大量数据。每个slice包含大约16个元素,如上所示(4x4)。当我简单地将所有16个元素放在一个[]float32{1..16}中时,fps提高了大约4。更新:我对每个追加进行了基

return - 从函数返回语句转到数组 slice

我有以下功能:func(c*Class)A()[4]bytefuncB(x[]byte)我要打电话B(c.A()[:])但是我得到这个错误:cannottaketheaddressofc.(*Class).A()如何正确获取Go中函数返回的数组的一部分? 最佳答案 c.A()的值,方法的返回值,不可寻址。AddressoperatorsForanoperandxoftypeT,theaddressoperation&xgeneratesapointeroftype*Ttox.Theoperandmustbeaddressable,t

go - Go 练习之旅 #18 : Slices

我正在尝试完成Exercise:SlicesfromtheGoTour.但是我真的不明白我被要求做什么。ImplementPic.Itshouldreturnasliceoflengthdy,eachelementofwhichisasliceofdx8-bitunsignedintegers.Whenyouruntheprogram,itwilldisplayyourpicture,interpretingtheintegersasgrayscale(well,bluescale)values.我有以下代码packagemainimport"golang.org/x/tour/pic