Назначение типа / создание структуры с помощью оператора switch - PullRequest
0 голосов
/ 27 апреля 2018

У меня возникли проблемы с выяснением, как создать структуру в операторе switch или назначить ей тип в операторе switch. Вот неработающий код, иллюстрирующий то, что я пытаюсь сделать:

var result

switch structPickingString {
case "struct1":
    result = new(struct1)
case "struct2":
    result = new(struct2)
}

//unmarshall some json into the appropriate struct type
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
    log.Println(err)
}
//print out that json with a function specific to that type of struct
result.Print()

Я думаю что-то, связанное с пустым interface{}, может быть связано с решением этой проблемы, но, к сожалению, я все еще немного не осведомлен о Голанге и не вижу, как заставить это работать.

Вот ссылка на слегка измененную версию кода для большего контекста: https://play.golang.org/p/Rb1oaMuvmU2

Проблема не в том, чтобы определить функцию печати, а в присвоении переменной типа result определенной структуры на основе использования отдельной функции Print, которую реализует структура.

Дайте мне знать, если я смогу предоставить больше информации.

Ответы [ 3 ]

0 голосов
/ 27 апреля 2018

Я думаю, вы хотите использовать такой интерфейс, как

type ResultIface interface {
     Print()
}

Тогда вы можете сделать

 var result ResultIface

 switch structPickingString {
 case "struct1":
     result = new(struct1)
 case "struct2":
     result = new(struct2)
}

Пока ваши struct1 и struct2 выполняют ResultIface, имея функцию Print, он будет печатать

0 голосов
/ 27 апреля 2018

Вам необходимо сопоставить "универсальный интерфейс" со структурами. Смотрите это:

//my struct1
type MyStruct1 struct {
    ID int
}

//my struct2
type MyStruct2 struct {
    ID int
}

//my interface
type MyStructGenerical interface {
    Print()
}

//method (match with MyStructGenerical)
func (m1 MyStruct1) Print() {
    println(m1.ID)
}

//method (match with MyStructGenerical)
func (m2 MyStruct2) Print() {
    println(m2.ID)
}

Таким образом, вы можете делать утверждения между структурами и общим интерфейсом. Смотрите это:

//here result is an generical interface
var result MyStructGenerical = nil

//checkin
switch structPickingString {
case "struct1":
    tmp := new(MyStruct1)
    result = tmp
case "struct2":
    tmp := new(MyStruct2)
    result = tmp
}

Результат:

//unmarshall some json into the appropriate struct type
if err := json.NewDecoder(body()).Decode(&result); err != nil {
    log.Println(err)
}

//print out that json with a function specific to that type of struct
tmp := result.(*MyStruct1)
tmp.Print()
// or
result.Print()

Обкатка: https://play.golang.org/p/nHrJnImsqNN

0 голосов
/ 27 апреля 2018

Поскольку вы звоните .Print, вам нужно использовать интерфейс, который имеет этот метод. Я думаю, что вы ищете что-то вроде

type Printer interface {
    Print()
}

func (s *struct1) Print() {
  // ...
}

func (s *struct2) Print() {
  // ...
}
var result Printer
switch structPickingString {
case "struct1":
    result = new(struct1)
case "struct2":
    result = new(struct2)
}

https://play.golang.org/p/W9r6UfeQSCz

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