Как назначить динамические типы в срезах - PullRequest
0 голосов
/ 09 ноября 2018

Я сделал приложение для обратного среза / массива. У меня была проблема, когда делаю ломтик с моим собственным типом. Вот не получится

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. Я до сих пор не знаю, как создать динамический тип в Голанге.

Любая помощь будет признательна. Вот игровая площадка Голанга моего кода https://play.golang.org/p/5QyTMcZFGPi

1 Ответ

0 голосов
/ 09 ноября 2018

Так что 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 предлагает интересный шаблон, который многие суслики используют, чтобы обойти отсутствие шаблонов / шаблонов на ходу. Целью шаблона является использование интерфейсов и добавление методов к этим интерфейсам для изменения базовых данных. Таким образом, каждая реализация интерфейса знает тип, но метод получения не должен заботиться.

...