粗略的时间使用reflect包使用struct字段.特别是,还没弄清楚如何设置字段值.
type t struct { fi int; fs string }
var r t = t{ 123, "jblow" }
var i64 int64 = 456
得到字段的名称我 - 这似乎工作
var field = reflect.TypeOf(r).Field(i).Name
获得字段i的值作为a)接口{},b)int - 这似乎有效
var iface interface{} = reflect.ValueOf(r).Field(i).Interface()
var i int = int(reflect.ValueOf(r).Field(i).Int())
设置字段的值i - 尝试一个 - 恐慌
reflect.ValueOf(r).Field(i).SetInt( i64 )
panic:reflect.Value·SetInt使用未导出字段获得的值
假设它不喜欢字段名称"id"和"name",所以重命名为"Id"和"Name"
a)这个假设是否正确?
b)如果正确,认为没有必要,因为在同一个文件/包中
设置字段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 )
他还记录了字段名称必须是可导出的(以大写字母开头)
我有一个结构人员.
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)
我已经排除的选项:
跟踪地图中每个结构中的字段,然后使用反射pkg中的FieldByName和Set*函数集合的组合.
手动创建一个循环遍历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属性
我有一个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) 我是Golang的新手,我无法使用flag找到解决此问题的方法。
我如何使用标志,以便我的程序可以处理此类调用,其中-term标志的出现次数可能是可变的,包括0次:
./myprogram -f flag1
./myprogram -f flag1 -term t1 -term t2 -term t3
Run Code Online (Sandbox Code Playgroud) 我试图使用变量键访问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)有意义的编译错误,但是我找不到解决方法。