Как в GOlang указать в функции что возвращаемый тип будет либо массив, либо еще что то?
Ответ на этот вопрос:Как в GOlang указать в функции что возвращаемый тип будет либо массив, либо еще что то
Go - язык со статической типизацией.
Вам нужно или явно преобразовать. 
Или использовать interface{} - но не рекомедуется этим злоупотреблять.
Ответ по приложенному вами исходному коду и тексту ошибки:
Но проблема у вас в другом.
Вы объявили переменные "b" и "err" внутри блоковif {
} else {
}
Соответственно снаружи блоков этих переменных не видно.
Выдается ошибка :
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"
}
Не обязательно строкой тип указывать, тут для наглядности.