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 博客:反射定律

在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)
}
回到顶部