go - 如何在切片中分配动态类型
问题描述
我制作了一个应用程序来反转切片/数组。用我自己的类型制作切片时遇到问题。这是行不通的
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
as int
。我仍然不知道如何在 Golang 中制作动态类型。
任何帮助将不胜感激。这是我的代码的 Golang Playground https://play.golang.org/p/5QyTMcZFGPi
解决方案
所以 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.json 中缺少泛型/模板的问题。该模式的 tl;dr 是使用接口并向这些接口添加方法以修改底层数据。这样,接口的每个实现都知道类型,但接收方法不必关心。
推荐阅读
- angular - 如果我使用 *ngFor 和指令,如何在 mat-table 中使用“数据标签”?
- php - 将php数组转换为json格式?
- playframework - Actor + playframework + slick 查询
- python - 蟒蛇 | 绘制带有边界和频率的直方图
- r - 删除组内的第一个和最后一个观察值
- kdb - 获取 q 目录中的路径名文件
- php - 到达文件末尾时无限循环
- javascript - 如何使此函数打印 10 个素数而不是 2 到 10 之间的数字
- ibm-cloud - 在 IBM COS 中创建服务凭证的 API
- sql - 检测重叠日期并更新最新记录 SQL Server 2008