Проверьте интерфейс nil и nil в Go
В настоящее время я использую эту вспомогательную функцию для проверки интерфейсов nil и nil.
func isNil(a interface{}) bool {
defer func() { recover() }()
return a == nil || reflect.ValueOf(a).IsNil()
}
Так как reflect.ValueOf(a).IsNil()
паника, если значение Kind является чем-то другим, кроме Chan
, Func
, Map
, Ptr
, Interface
или Slice
, я отложил отложенный recover()
, чтобы поймать те.
Есть ли лучший способ добиться этой проверки? Он считает, что для этого должен быть более прямой способ.
Ответы
Ответ 1
См. например, Кайл в этом thread в списке рассылки golang-nut.
Вкратце: если вы никогда не храните (*T)(nil)
в интерфейсе, вы можете надежно использовать сравнение с nil, не нужно использовать отражение. С другой стороны, назначение нетипизированного nil для интерфейса всегда в порядке.