Передать указатель массива в функцию, ожидающую интерфейс типа - PullRequest
0 голосов
/ 11 марта 2020

Пример из книги Golang показывает указатель на массив, передаваемый в функцию по ссылке:

package main

import "fmt"

func reclassify(planets *[]string) {
    *planets = (*planets)[0:8]
}


func main() {
    planets := []string{
        "mercury", "venus", "earth", "mars", "jupiter",
        "saturn", "uranus", "neptune", "pluto",
    }
    reclassify(&planets)
    fmt.Println(planets)
}

Я попытался заменить строковый аргумент * [] для reclassify () на интерфейс:

func reclassify(planets interface{}) {
    *planets = planets.(*[]string)[0:8]
}

Однако я получаю следующие ошибки:

./test.go:10:2: invalid indirect of planets (type interface {})
./test.go:10:32: cannot slice planets.(*[]string) (type *[]string)

Я использовал интерфейс раньше для передачи различных типов данных в данную функцию. Возможно ли сделать это для этого примера подобным образом?

Я вижу, что переменная * planets моей версии не имеет смысла, но я не уверен, что изменить, если что-нибудь.

1 Ответ

1 голос
/ 11 марта 2020

Я рекомендую использовать утверждение типа, чтобы определить тип и обновить его. interface в Golang это просто интерфейс.

func reclassify(planets interface{}) {
    switch v := planets.(type) {
        case *[]string:
            fmt.Println("Slice string:",*v)
            *v = (*v)[0:8]
        default:
            fmt.Println("Uknown")
    }
}
...