【发布时间】:2019-09-16 08:48:02
【问题描述】:
我遇到了这样的问题。 如果它们的类型和字段名称相等,我需要比较两个结构。 将值从酸分配到 dist。我写了一些代码,但在这里我可以分配 reflect.Field() 值。你可以帮帮我吗?我在下面创建测试
import (
"reflect"
"testing"
)
func Assign(sour interface{}, dist interface{}) uint {
counter := 0
source := reflect.ValueOf(sour)
target := reflect.ValueOf(dist)
typeSource := reflect.TypeOf(sour)
typeTarget := reflect.TypeOf(dist)
for i:=0; i<source.NumField(); i++{
for j:=0; j<target.NumField();j++{
if (typeSource.Field(i).Type==typeTarget.Field(j).Type && typeSource.Field(i).Name==typeTarget.Field(j).Name){
counter = counter + 1
target.FieldByName(typeSource.Field(i).Name).Set(source.Field(i))
}
}
}
return uint(counter)
}
func TestAssign(t *testing.T) {
type A struct {
A string
B uint
C string
}
type B struct {
AA string
B int
C string
}
var (
a = A{
A: "Тест A",
B: 55,
C: "Test C",
}
b = B{
AA: "OKOK",
B: 10,
C: "FAFA",
}
)
result := Assign(a, b)
switch true {
case b.B != 10:
t.Errorf("b.B = %d; need to be 10", b.B)
case b.C != "Test C":
t.Errorf("b.C = %v; need to be 'Test C'", b.C)
case result != 1:
t.Errorf("Assign(a,b) = %d; need to be 1", result)
}
}
【问题讨论】:
-
请不要将代码粘贴到 cmets 中,它不可读。您可以更新问题并在那里添加更新的代码,还可以添加您看到的错误。
-
对不起,这是我在stackoverflow中的第一个问题。
-
您需要将指针传递给
b。例如。Assing(a, &b). -
感谢您的回答。现在我怎样才能将你的答案标记为正确?