Могу ли я получить ожидаемую функцию, которая производит различные типы объектов на основе ее json и типа?
func MockData(filename string, v interface{}) (interface{}, error) {
data, _ := ioutil.ReadFile(filename)
switch t := v.(type) {
case Req:
// t at this point is a Req{}
err := json.Unmarshal(data, &t)
return t, err
}
return nil, errors.New("unknown type")
}
Я действительно не знаю вашу мотивацию, почему вы должны пройтифактическая структура, а не указатель. Проверьте эту демонстрацию
Почему тип объекта изменился после демаршала и почему он не изменился после добавления &?
Когда вы демаршируетеиспользуя &ret
, где ret
- интерфейс, вы получаете адрес интерфейса.Следовательно, json.Unmarshal()
увидит, что данные поддержки являются интерфейсом, а не указателем на структуру.Тип данных по умолчанию, который json.Unmarshal()
будет использовать, - map[string]interface{}
для объектов и []interface{}
для массивов.
Теперь, если вы удалите маршалинг с помощью ret
, где ret
равно &Req{}
, json.Unmarshal()
будетпроверьте, что данные поддержки имеют значение struct
, следовательно, он может выполнить демаршализацию с помощью полей структуры.
Edit :
Вы, кажется, смущены указатель на интерфейс , который отличается от интерфейса с указателем .Попробуйте этот код, и вы увидите разницу.
var x interface{} = Req{}
var y interface{} = &x
var z interface{} = &Req{}
fmt.Printf("%T\n", y)
fmt.Printf("%T\n", z)
Помните, что интерфейсы - это просто нормальные значения, и они также занимают память.Теперь, если вы берете адрес этой памяти, вы получите указатель на интерфейс, а не указатель на данные, на которые ссылается интерфейс.