我制作了一个应用来反转切片/数组。 用自己的类型制作切片时出现问题。 这是行不通的
type mytype int
func main() {
// []mytype doesn't work
// var slice = []mytype{11, 22, 33, 44}
但是如果我将mytype
更改为int
,它将起作用
// []int It works
var slice = []int{11, 22, 33, 44}
错误提示
panic: interface conversion: interface {} is *[]main.mytype, not *[]int
我发现错误来自此行
sliceType := *slice.(*[]int)
因为我将sliceType
声明为int
。我仍然不知道如何在Golang中创建动态类型。
任何帮助将不胜感激。这是我的代码https://play.golang.org/p/5QyTMcZFGPi
的Golang游乐场答案 0 :(得分:0)
所以go不允许您那样做动态类型。因此,如果您希望代码与mytype
一起使用,请尝试以下操作:
package main
import (
"fmt"
"reflect"
)
//Reverse reverses a slice.
func Reverse(slice *[]mytype) {
s := reflect.ValueOf(slice)
if s.Kind() != reflect.Ptr {
panic("Must be a pointer")
}
sliceLen := s.Elem().Len()
sliceType := *slice
for left, right := 0, sliceLen-1; left < right; left, right = left+1, right-1 {
sliceType[left], sliceType[right] = sliceType[right], sliceType[left]
}
s.Elem().Set(reflect.ValueOf(sliceType))
}
type mytype int
func main() {
var slice = []mytype{11, 22, 33, 44}
Reverse(&slice)
fmt.Println("RESULT", slice) // RESULT [44 33 22 11]
}
但是,您可能会想:“好吧,我需要反转很多不同类型的切片...”。好吧,你也在那里覆盖了!
签出sort.Reverse。
sort包提供了一个有趣的模式,许多gopher都使用它来解决go中缺少泛型/模板的问题。模式的tl; dr是使用接口并向这些接口添加方法以修改基础数据。这样,接口的每个实现都知道类型,但是接收方法不必关心。