Нотация «...» в append () не работает для добавления фрагментов разных типов - PullRequest
0 голосов
/ 30 октября 2018

Мне нужен абстрактный фрагмент, содержащий несколько типов. Самый упрощенный код такой:

package main

import "fmt"

type A interface{}

type X string

func main() {
    sliceA := make([]A, 0, 0)
    sliceX := []X{"x1", "x2"}
    var appendedSlice []A
    appendedSlice = append(sliceA, sliceX[0], sliceX[1])  // (1) works
    appendedSlice = append(sliceA, sliceX...)             // (2) doesn't work
    fmt.Println(appendedSlice)

}

В моей реальной программе интерфейс A определяет некоторые функции, а X, а также другие типы реализуют его.

Строка (2) вызывает ошибку cannot use sliceX (type []X) as type []A in append.

Я думал (2) - это синтаксический сахар для (1), но я, вероятно, что-то упускаю ... Должен ли я всегда добавлять элемент X в срез A один за другим?

Заранее спасибо, ребята!

1 Ответ

0 голосов
/ 30 октября 2018

Проблема в том, что interface{} и string - это два разных типа. Чтобы преобразовать фрагмент из string в interface{}, вам нужно будет сделать это одним из следующих способов:

создать sliceA и инициализировать его размер длиной sliceX

sliceA := make([]A, len(sliceX))
for ix, item := range sliceX {
    sliceA[ix] = item
}

динамически добавлять элементы sliceX в appendedSlice

var appendedSlice []A
for ix := range sliceX {
    appendedSlice = append(appendedSlice, sliceX[ix])
}

Пожалуйста, прочитайте больше здесь Преобразовать строку [] в интерфейс [] {}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...