@aassdds
Люблю борщ и PHP

Как в GOlang указать в функции что возвращаемый тип будет либо массив, либо еще что то?

Добрый день
Для примера есть функция:
func getMsgPack(row string) []byte{
	in := strings.Split(row,"\t")
	if msg_format == "json" {
		b, err := json.Marshal(in)
	}else{
		b, err := msgpack.Marshal(in)
	} // if
	failOnError(err, strings.Join([]string{"Failed to convert msg to msgPack. Format: ", msg_format},""))
	return b
} // func


Выдается ошибка :
undefined b
undefined err
на вот эти 2 строки:
failOnError(err, strings.Join([]string{"Failed to convert msg to msgPack. Format: ", msg_format},""))
	return b


как я понял - проблема в возвращаемом типе

То есть вернется либо json либо msgpack - как это указать в возвращаемом типе ?
  • Вопрос задан
  • 664 просмотра
Решения вопроса 1
@abroabr
Ответ на этот вопрос:

Как в GOlang указать в функции что возвращаемый тип будет либо массив, либо еще что то


Go - язык со статической типизацией.

Вам нужно или явно преобразовать.
Или использовать interface{} - но не рекомедуется этим злоупотреблять.

Ответ по приложенному вами исходному коду и тексту ошибки:

Но проблема у вас в другом.
Вы объявили переменные "b" и "err" внутри блоков
if {
} else {
}

Соответственно снаружи блоков этих переменных не видно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@ivahaev
Программист, связист и просто хороший человек
Выдается ошибка :
undefined b
undefined err
на вот эти 2 строки:

Это потому что переменные b и err не определены. Здесь затенение переменных. Чтобы заработало:
var b []byte
  var err error
  if msg_format == "json" {
    b, err = json.Marshal(in)
  } else {
    b, err = msgpack.Marshal(in)
  }


Далее, если тип возвращаемого значения один ([]byte), но содержание может быть разным, можешь вернуть еще один аргумент, который будет содержать тип (json или msgpack)
func getMsgPack(row string) ([]byte, string) {
  // omited
  return b, "json"
}


Не обязательно строкой тип указывать, тут для наглядности.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы