英文:
How to check if generic type is nil
问题
我有一个通用函数。我想检查提供的参数是否为nil(并防止它)。
最好的方法是什么?
以下是示例代码:
func main() {
Hello(1)
}
func Hello[T any](id T) {
if reflect.ValueOf(id).IsNil() {
panic("id不能为nil")
}
fmt.Printf("Hello %v\n", id)
}
该代码会引发panic。
英文:
I have a generic function. I want to check if parameter provided is nil (and prevent it).
What is the best way to do it?
Here is a sample code:
func main() {
Hello(1)
}
func Hello[T any](id T) {
if reflect.ValueOf(id).IsNil() {
panic("id cannot be nil")
}
fmt.Printf("Hello %v\n", id)
}
That code panics.
答案1
得分: 2
对于指针,这段代码可以工作:
func isNil[T comparable](arg T) bool {
var t T
return arg == t
}
链接:https://go.dev/play/p/G9K3i28qGFX
英文:
For pointers this works:
func isNil[T comparable](arg T) bool {
var t T
return arg == t
}
答案2
得分: 0
只有 chan、func、interface、map、pointer 和 slice 类型可以为 nil。在调用 IsNil 之前,请检查这些类型之一。
func Hello[T any](id T) {
if v := reflect.ValueOf(id); (v.Kind() == reflect.Ptr ||
v.Kind() == reflect.Interface ||
v.Kind() == reflect.Slice ||
v.Kind() == reflect.Map ||
v.Kind() == reflect.Chan ||
v.Kind() == reflect.Func) && v.IsNil() {
panic("id cannot be nil")
}
fmt.Printf("Hello %v\n", id)
}
英文:
The only types that can be nil are chan, func, interface, map, pointer, and slice. Check for one of those types before calling IsNil
func Hello[T any](id T) {
if v := reflect.ValueOf(id); (v.Kind() == reflect.Ptr ||
v.Kind() == reflect.Interface ||
v.Kind() == reflect.Slice ||
v.Kind() == reflect.Map ||
v.Kind() == reflect.Chan ||
v.Kind() == reflect.Func) && v.IsNil() {
panic("id cannot be nil")
}
fmt.Printf("Hello %v\n", id)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论