将未知长度的切片中的值分配给 Go 中的结构?

我从 github 中的一些有用的包中找到了下面的案例,它看起来非常丑陋和愚蠢。我觉得更好的代码设计可以避免这种情况,但是如果遇到这种情况,是不是可以写的更简洁一些呢?


有没有更好的方法来代替连续检查切片长度?


package main


type NumberSet struct {

    SetName string

    Number1 int

    Number2 int

    Number3 int

}


func main() {

    set := &NumberSet{SetName: "test"}

    var numbers []int

    // assume that we don't know the actual length of slice

    numbers = append(numbers, 1)

    numbers = append(numbers, 2)


    length := len(numbers)

    if length > 0 {

        set.Number1 = numbers[0]

    }

    if length > 1 {

        set.Number2 = numbers[1]

    }

    if length > 2 {

        set.Number3 = numbers[2]

    }

}


慕村9548890
浏览 71回答 1
1回答

慕娘9325324

您可以使用 afor range来遍历数字,这样您就可以省略长度检查,并使用 aswitch进行字段分配,例如:for i, v := range numbers {    switch i {    case 0:        set.Number1 = v    case 1:        set.Number2 = v    case 2:        set.Number3 = v    }}在Go Playground上尝试一下。您还可以列出另一个切片中字段的地址,并使用单个循环进行分配:ps := []*int{&set.Number1, &set.Number2, &set.Number3}for i, v := range numbers {    *ps[i] = v}在Go Playground上尝试一下。如果性能不是很关键,而且你赋值的字段是顺序的,你可以使用反射来赋值,而不必枚举字段,例如:rv := reflect.ValueOf(set).Elem()for i, v := range numbers {    rv.Field(1 + i).Set(reflect.ValueOf(v)) // 1 is the offset of Number1}在Go Playground上尝试一下。
打开App,查看更多内容
随时随地看视频慕课网APP