登录
首页 >  Golang >  Go问答

使用结构体创建数组

来源:stackoverflow

时间:2024-03-22 10:46:27 275浏览 收藏

偷偷努力,悄无声息地变强,然后惊艳所有人!哈哈,小伙伴们又来学习啦~今天我将给大家介绍《使用结构体创建数组》,这篇文章主要会讲到等等知识点,不知道大家对其都有多少了解,下面我们就一起来看一吧!当然,非常希望大家能多多评论,给出合理的建议,我们一起学习,一起进步!

问题内容

我正在尝试从一个结构构建两个数组。一个包含属性列表,另一个包含值列表。

我根据我发现的一些使用反射的示例做了一些尝试(https://gist.github.com/justincase/5469009)

这是我最接近可行的实现:

func main() {
    type something struct {
        some string
        thing int
    }
    var props []string
    var vals []string

    m := something{"smth", 666}
    s := reflect.valueof(&m).elem()
    for i := 0; i < s.numfield(); i++ {
        f := s.field(i)
        props = append(props, s.type().field(i).name)
        value, _ := fmt.printf("%v", f.interface())
        vals = append(vals, string(value))
    }
    fmt.println(props)
    fmt.println(vals)
}

附加到数组后我得到了奇怪的结果

smth666[Some Thing]
[ ]

https://play.golang.org/p/lzhtwx-wbw1


解决方案


检查一下:

func main() {
    type something struct {
        some  string
        thing int
    }
    var props []string
    var vals []string

    m := something{"smth", 123}
    s := reflect.valueof(m)
    for i := 0; i < s.numfield(); i++ {
        props = append(props, s.type().field(i).name)
        vals = append(vals, fmt.sprintf("%v", s.field(i).interface()))
    }

    fmt.println(props)
    fmt.println(vals)
}

结果:

[some thing]
[smth 123]

它也适用于命名字段,例如:

something{
    some:  "smth",
    thing: 123,
}

此外,由于您需要一个字符串数组(实际上是切片!)(即使您的值是 int 等其他类型),您可以使用 fmt.sprintf()interface{} 转换为字符串

您的解决方案过于复杂,不需要反射,您还应该使用 strings.itoa() 将 int 转换为字符串,而不是简单地调用 string()

package main

import (
    "fmt"
    "strconv"
)

func main() {
    type Something struct {
        Some string
        Thing int
    }
    var props []string
    var vals []string

    var x = Something{
        Some:  "a name",
        Thing: 123,
    }
    props = append(props, x.Some)
    vals = append(vals, strconv.Itoa(x.Thing))

    fmt.Println(props)
    fmt.Println(vals)
}

working example on go playground

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于Golang的相关知识,也可关注golang学习网公众号。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>