Golang中如何获取结构体数组的长度
Golang中如何获取结构体数组的长度 我有多个结构体数组,需要获取它们的长度……请参考以下示例:
package main
import (
"fmt"
)
type X struct {
S string
}
type Y struct {
N int
}
func main() {
type t interface{}
var x, y t
x = []X{{S: "xxx"}, {S: "zzz"}}
y = []Y{{N: 4}, {N: 5}, {N: 3}}
Process(x, y)
}
func Process(i ...interface{}) {
for _, v := range i {
fmt.Println(v)
fmt.Println(len(v))
}
}
更多关于Golang中如何获取结构体数组的长度的实战教程也可以访问 https://www.itying.com/category-94-b0.html
3 回复
非常感谢 petrus……显然我需要去读 Donovan 和 Kernighan 那本书里我一直拖延没看的那一章 🙂
更多关于Golang中如何获取结构体数组的长度的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
package main
import (
"fmt"
"reflect"
)
type X struct {
S string
}
type Y struct {
N int
}
func Process(i ...interface{}) {
for _, v := range i {
s := reflect.ValueOf(v)
if s.Kind() != reflect.Slice {
continue
}
fmt.Println(s.Len(), s)
}
}
func main() {
type t interface{}
var x, y t
x = []X{{S: "xxx"}, {S: "zzz"}}
y = []Y{{N: 4}, {N: 5}, {N: 3}}
Process(x, y)
}
https://play.golang.org/p/uZQ_7xZ4N-7
2 [{xxx} {zzz}]
3 [{4} {5} {3}]
在Go语言中,获取结构体数组长度的正确方法是使用reflect包来处理接口类型。以下是修改后的代码:
package main
import (
"fmt"
"reflect"
)
type X struct {
S string
}
type Y struct {
N int
}
func main() {
type t interface{}
var x, y t
x = []X{{S: "xxx"}, {S: "zzz"}}
y = []Y{{N: 4}, {N: 5}, {N: 3}}
Process(x, y)
}
func Process(i ...interface{}) {
for _, v := range i {
fmt.Println(v)
// 使用reflect获取切片长度
rv := reflect.ValueOf(v)
if rv.Kind() == reflect.Slice {
fmt.Println("长度:", rv.Len())
} else {
fmt.Println("不是切片类型")
}
}
}
输出结果:
[{xxx} {zzz}]
长度: 2
[{4} {5} {3}]
长度: 3
如果需要直接获取长度而不使用反射,可以定义具体的切片类型:
func ProcessSlices(x []X, y []Y) {
fmt.Println("x长度:", len(x))
fmt.Println("y长度:", len(y))
}
func main() {
x := []X{{S: "xxx"}, {S: "zzz"}}
y := []Y{{N: 4}, {N: 5}, {N: 3}}
ProcessSlices(x, y)
}
对于泛型方法(Go 1.18+):
func ProcessGeneric[T any](slices ...[]T) {
for i, slice := range slices {
fmt.Printf("切片%d长度: %d\n", i, len(slice))
}
}
func main() {
x := []X{{S: "xxx"}, {S: "zzz"}}
y := []Y{{N: 4}, {N: 5}, {N: 3}}
ProcessGeneric(x, y)
}

