Что reflect.New()
делает согласно документации :
New возвращает значение, представляющее указатель на новое нулевое значение для указанного типа. То есть тип возвращаемого значения - PtrTo (тип).
В основном это создаст новые данные со значением, равным нулевому значению типа. Нулевое значение []int
равно nil
.
В вашем коде оба значения s0
и s2
не равны нулю. Но s1
будет нулевым значением типа []int
(то есть nil
) , поскольку оно создано с использованием reflect.New()
.
Код ниже является доказательством того, что нулевое значение среза равно nil
.
var a []int = []int{}
log.Printf("%#v \n", a) // ====> []int{}
var b []int
log.Printf("%#v \n", b) // ====> []int(nil)
Я предлагаю использовать reflect.MakeSlice()
вместо того, чтобы сделать ломтик. Сгенерированное значение не будет nil
.
func makeslice(slice interface{}) interface{} {
return reflect.MakeSlice(reflect.TypeOf(slice), 0, 0).Interface()
}
Тогда в зависимости от вашего кода вы получите:
case 1: []int [] <nil> []
case 2: []int [] <nil> []
Рабочая площадка: https://play.golang.org/p/tL3kFqVwOtC
Преобразование []int
со значением nil
в JSON приведет к null
. Но преобразование []int{}
данных в JSON приведет к []
, потому что данные являются пустым срезом (не нулевым срезом).
Как следует из комментария, этот метод создает адресуемый фрагмент, который может быть дополнительно изменен с помощью отражения:
func makeslice(slice interface{}) interface{} {
newsliceval := reflect.MakeSlice(reflect.TypeOf(slice),0,0)
newslice := reflect.New(newsliceval.Type()).Elem()
newslice.Set(newsliceval)
/*
* make any desired changes to newslice with reflect package
*/
return newslice.Interface()
}
Больше объяснений здесь
Почему golang отражают. MakeSlice возвращает не адресуемое значение .