相关疑难解决方法(0)

使用reflect,如何设置struct字段的值?

粗略的时间使用reflect包使用struct字段.特别是,还没弄清楚如何设置字段值.

type t struct { fi int; fs string }
var r t = t{ 123, "jblow" }
var i64 int64 = 456
  1. 得到字段的名称我 - 这似乎工作

    var field = reflect.TypeOf(r).Field(i).Name

  2. 获得字段i的值作为a)接口{},b)int - 这似乎有效

    var iface interface{} = reflect.ValueOf(r).Field(i).Interface()

    var i int = int(reflect.ValueOf(r).Field(i).Int())

  3. 设置字段的值i - 尝试一个 - 恐慌

    reflect.ValueOf(r).Field(i).SetInt( i64 )

    panic:reflect.Value·SetInt使用未导出字段获得的值

    假设它不喜欢字段名称"id"和"name",所以重命名为"Id"和"Name"

    a)这个假设是否正确?

    b)如果正确,认为没有必要,因为在同一个文件/包中

  4. 设置字段i的值 - 尝试两个(字段名称大写) - 恐慌

    reflect.ValueOf(r).Field(i).SetInt( 465 )

    reflect.ValueOf(r).Field(i).SetInt( i64 )

    恐慌:反映.值/ SetInt使用不可寻址的值


@peterSO下面的说明是彻底和高质量的

四.这工作:

reflect.ValueOf(&r).Elem().Field(i).SetInt( i64 )

他还记录了字段名称必须是可导出的(以大写字母开头)

reflection go go-reflect

94
推荐指数
2
解决办法
7万
查看次数

如何遍历Golang结构中的字段以可扩展的方式获取和设置值?

我有一个结构人员.

type Person struct {
    Firstname string       
    Lastname  string       
    Years     uint8       
}
Run Code Online (Sandbox Code Playgroud)

然后我有这个结构的两个实例,PersonA和PersonB.

PersonA := {"", "Obama", 6}
PersonB := {"President", "Carter", 8}
Run Code Online (Sandbox Code Playgroud)

我想编写一个函数,在给定每个字段的某些条件(即非空)的情况下,将值从PersonA复制到PersonB.我知道如何通过对字段名称进行硬编码来实现这一点,但是我想要一个即使我更改Person结构也能工作的函数.

我知道Go反射是有帮助的,但问题是获取并设置值需要知道类型,如果你想使用像SetInt这样的东西.但有一种"简单"的方法吗?

**Javascript类比**在Javascript中,你可以做一个(在someObject中的属性)循环.

(for propt in personA) {
  if personA[propt] != "" {
    // do something
    personB[propt] = personA[propt]
  }
}
Run Code Online (Sandbox Code Playgroud)

我已经排除的选项:

  1. 跟踪地图中每个结构中的字段,然后使用反射pkg中的FieldByName和Set*函数集合的组合.

  2. 手动创建一个循环遍历Person(下面).因为我想为许多其他结构(学校,动物等)做这种类型的"更新"

    if PersonA.Firstname != "" {
      PersonB.Firstname = PersonA.Firstname 
    }
    
    Run Code Online (Sandbox Code Playgroud)

    ...

    if PersonA.Years != "" {
      PersonB.Years = PersonA.Years 
    }
    
    Run Code Online (Sandbox Code Playgroud)

下面的问题让我在那里中途,但仍然不能扩展到我想要利用这个"更新"功能的所有结构.

在Golang中,使用reflect,如何设置struct字段的值?

**其他有用的链接** GoLang:按名称访问struct属性

reflection go

14
推荐指数
3
解决办法
3万
查看次数

在go lang中按不同的维度对点(结构)进行排序

我有一个Points类型的多维点列表.

我已经实现了sort.Sort界面,现在可以排序了y value.

例如

type Points []*Point

func (points Points) Len() int {
    return len(points)
}
func (points Points) Less(i, j int) bool {
    return points[i].y < points[j].y
}
func (points Points) Swap(i, j int) {
    points[i], points[j] = points[j], points[i]
}

type Point struct {
    x int
    y int
    country_id int
}
Run Code Online (Sandbox Code Playgroud)

现在我想用x value而不是来分类我的观点y value.

我的想法是使用带有全局标志的if语句(可以在排序之前打开或关闭):

func (points Points) Less(i, j int) bool {
    if SORT_BY_X {
        return points[i].x < points[j].x …
Run Code Online (Sandbox Code Playgroud)

sorting struct go

4
推荐指数
2
解决办法
1869
查看次数

Golang标志:忽略丢失的标志并解析多个重复的标志

我是Golang的新手,我无法使用flag找到解决此问题的方法。

我如何使用标志,以便我的程序可以处理此类调用,其中-term标志的出现次数可能是可变的,包括0次:

./myprogram -f flag1
./myprogram -f flag1 -term t1 -term t2 -term  t3
Run Code Online (Sandbox Code Playgroud)

go go-flag

3
推荐指数
1
解决办法
1397
查看次数

使用变量访问golang结构字段

供参考:此处示例

我试图使用变量键访问struct字段,以在PHP中进行解释,您可以执行以下操作。

$arr = ["test" => "foo"];
$key = "test";
$result = $arr[$key];
Run Code Online (Sandbox Code Playgroud)

或者使用Javascript,您可以执行以下操作

const obj = {"test": "foo"}
const key = "test"
const result = obj[key]
Run Code Online (Sandbox Code Playgroud)

go结构可能吗?我已经搜索了此功能,但是答案似乎总是指向反射包,并在结构字段上运行for循环。

我的代码(在上面链接)得到了invalid operation: p[key] (type Post does not support indexing)有意义的编译错误,但是我找不到解决方法。

indexing struct go

3
推荐指数
1
解决办法
2118
查看次数

标签 统计

go ×5

reflection ×2

struct ×2

go-flag ×1

go-reflect ×1

indexing ×1

sorting ×1