英文:
How reslove pointer to array from pointer to single object
问题
我尝试在我的程序中找到一种解决方法,以便在特定函数中使用interface{}
作为参数,来区分指向数组的指针和指向单个对象的指针。目前我使用以下方式得到了结果:
func object(v interface{}) {
if strings.HasPrefix(reflect.TypeOf(v).String(), "*[]") {
// 指向数组的指针
} else {
// 指向单个对象的指针
}
}
上述方法可以工作,但对我来说不是很清晰的代码。我认为可以使用Golang的类型和反射包来更好地解决这个问题,但我现在不知道如何做,请您给予建议。
附注:我不想使用switch
语句,例如:
switch v.(type) {
case *[]someType:
// 数组
default:
// 单个对象
}
这种方法应该更通用,不依赖于数组对象的具体类型。
英文:
I try in my porogram find way to resolve beetwen type pointer to array form pointer to single object using interface{}
as argument in particular function. On this time i get this reslut using below way:
func object( v interface{}) {
if strings.HasPrefix(reflect.TypeOf(v).String(), "*[]") {
// pointer to array
} else {
// pointer to single object
}
}
Above way works, but for me this is not clean code. I think that exist some better way to solve this using golang package as type, reflect but now I don't no how so please Your suggestion.
Ps. I don't want to use switch
statemet for example:
switch v.(type){
case *[]someType:
// array
default:
// single object
}
This should be more universal does not depend on the type object of array
答案1
得分: 2
使用reflect.Kind
来检查你所拥有的值的类型:
func object(i interface{}) {
v := reflect.ValueOf(i)
switch v.Kind() {
case reflect.Ptr:
fmt.Print("我们有一个指针 ")
switch v.Elem().Kind() {
case reflect.Slice:
fmt.Println("指向一个切片")
case reflect.Array:
fmt.Println("指向一个数组")
case reflect.Struct:
fmt.Println("指向一个结构体")
default:
fmt.Println("指向一个意外的类型", v.Elem().Kind())
}
}
}
https://play.golang.org/p/q32Cfz_dmF
英文:
Use the reflect.Kind
to check the kind of value you have:
func object(i interface{}) {
v := reflect.ValueOf(i)
switch v.Kind() {
case reflect.Ptr:
fmt.Print("we have a pointer ")
switch v.Elem().Kind() {
case reflect.Slice:
fmt.Println("to a slice")
case reflect.Array:
fmt.Println("to an array")
case reflect.Struct:
fmt.Println("to a struct")
default:
fmt.Println("to unexpected type ", v.Elem().Kind())
}
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论