英文:
how to use reflect know the slice data type?
问题
我想填充切片数据,但是使用reflect.kind()只能告诉我字段(0)是切片,但我不知道它是哪种类型的切片,可能是int[]、string[]或其他类型的切片。
在我知道切片数据类型之前,匆忙设置值会导致恐慌,有人知道如何获取切片类型信息吗?
func WhatSlice(isAny any) {
vof := reflect.ValueOf(isAny)
if vof.Kind() != reflect.Struct {
return
}
switch vof.Field(0).Kind() {
case reflect.Slice:
for i := 0; i < vof.Field(0).Len(); i++ {
// 如何知道这个字段是[]int还是[]string?
// vof.Field(0).Index(i).Set()
}
default:
return
}
}
英文:
i want to fill the slice data , but using reflect.kind() only let me know field(0) is slice ,
but i don't know it is which type of slice , it culd be int[] or string[] or other type slice
befor i know what slice data type , hastily set value will panic , do some know how to get slice type info?
func WhatSlice(isAny any) {
vof := reflect.ValueOf(isAny)
if vof.Kind() != reflect.Struct {
return
}
switch vof.Field(0).Kind() {
case reflect.Slice:
for i := 0; i < vof.Field(0).Len(); i++ {
// how to know this field is []int or []string?
// vof.Field(0).Index(i).Set()
}
default:
return
}
}
答案1
得分: 2
你可以在调用循环之前使用vof.Field(0).Index(0).Kind()
来检查它。
func WhatSlice(isAny any) {
vof := reflect.ValueOf(isAny)
if vof.Kind() != reflect.Struct {
return
}
switch vof.Field(0).Kind() {
case reflect.Slice:
if vof.Field(0).Len() == 0 {
fmt.Println("空切片")
return
}
switch vof.Field(0).Index(0).Kind() {
case reflect.Int:
fmt.Println("这里是int")
// for i := 0; i < vof.Field(0).Len(); i++ {
// 如何知道这个字段是 []int 还是 []string?
// vof.Field(0).Index(i).Set()
// }
case reflect.String:
fmt.Println("这里是string")
}
default:
return
}
}
英文:
You can check it before call for loop with vof.Field(0).Index(0).Kind()
func WhatSlice(isAny any) {
vof := reflect.ValueOf(isAny)
if vof.Kind() != reflect.Struct {
return
}
switch vof.Field(0).Kind() {
case reflect.Slice:
if vof.Field(0).Len() == 0 {
fmt.Println("empty slice")
return
}
switch vof.Field(0).Index(0).Kind() {
case reflect.Int:
fmt.Println("int here")
// for i := 0; i < vof.Field(0).Len(); i++ {
// how to know this field is []int or []string?
// vof.Field(0).Index(i).Set()
// }
case reflect.String:
fmt.Println("string here")
}
default:
return
}
}
答案2
得分: 1
使用Type
可以直接获取切片类型,但应使用字符串类型来区分它。
func WhatSlice(isAny any) {
vof := reflect.ValueOf(isAny)
if vof.Kind() != reflect.Struct {
return
}
switch vof.Field(0).Kind() {
case reflect.Slice:
switch vof.Field(0).Type().String() {
case "[]int":
fmt.Println("这里是int类型")
case "[]string":
fmt.Println("这里是string类型")
}
default:
return
}
}
英文:
Use the Type
you can directly get the slice type
but should use the string type to distinguish it.
func WhatSlice(isAny any) {
vof := reflect.ValueOf(isAny)
if vof.Kind() != reflect.Struct {
return
}
switch vof.Field(0).Kind() {
case reflect.Slice:
switch vof.Field(0).Type().String() {
case "[]int":
fmt.Println("int here")
case "[]string":
fmt.Println("string here")
}
default:
return
}
}
答案3
得分: -2
如果你想获取切片的类型,你可以参考这个页面:
英文:
if you want get the type to slice you can refer to this page :
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论