【问题标题】:How to assign dynamic types in slices如何在切片中分配动态类型
【发布时间】:2019-04-13 06:57:02
【问题描述】:

我制作了一个应用来反转切片/数组。 用我自己的类型制作切片时遇到问题。 这是行不通的

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 中制作动态类型。

任何帮助将不胜感激。这是我的代码的 Golang Playground https://play.golang.org/p/5QyTMcZFGPi

【问题讨论】:

  • 我收到错误panic: reflect.Set: value of type []interface {} is not assignable to type []main.mytype
  • “不知道如何在 Golang 中创建动态类型” - 你不能,句号。 Go 是一种静态类型语言。

标签: go types slice


【解决方案1】:

所以 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 是使用接口并向这些接口添加方法来修改底层数据。这样接口的每个实现都知道类型,但接收方法不必关心。

【讨论】:

    猜你喜欢
    • 2022-11-03
    • 2017-01-02
    • 2019-10-17
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多