gpt4 book ai didi

go - 如何合并两个相同结构类型的 Go 值?

转载 作者:数据小太阳 更新时间:2023-10-29 03:09:36 30 4
gpt4 key购买 nike

我想创建一个名为 merge() 的函数,它接受同一结构的两个值,但任何结构,并返回这两个值的合并值结构。

我希望第一个值优先。例如,如果有两个结构ab,在调用merge(a,b)之后,如果有两个的字段>ab 包含,我希望它在给定字段中具有 a 的值。

实现这个的最佳方法是什么? https://play.golang.org/p/7s9PWx26gfz

type cat struct {
name string
color string
age int
}

type book struct {
title string
author string
}

func main() {
c1 := cat{
name: "Oscar",
color: "",
age: 3,
}

c2 := cat{
name: "",
color: "orange",
age: 2,
}

c3 := merge(c1, c2)

// want: c3 = cat{
// name: "Oscar",
// color: "orange",
// age: 3,
// }



// another case...
b1 := book{
title: "Lord of the Rings",
author: "John Smith",
}

b2 := book{
title: "Harry Potter",
author: "",
}

b3 := merge(b1, b2)

// want: b3 = book{
// title: "Lord of the Rings",
// author: "John Smith",
// }
}

这是我目前所拥有的:

// merges two structs, where a's values take precendence over b's values (a's values will be kept over b's if each field has a value)
func merge(a, b interface{}) (*interface{}, error) {
var result interface{}
aFields := reflect.Fields(a)
bFields := reflect.Fields(b)

if !reflect.DeepEqual(aFields, bFields) {
return &result, errors.New("cannot merge structs of different struct types")
}

aValOf := reflect.ValueOf(a)
bValOf := reflect.ValueOf(b)
resultValOf := reflect.ValueOf(result)
aValues := make([]interface{}, aValOf.NumField())
resultValues := make([]interface{}, resultValOf.NumField())

for i := 0; i < aValOf.NumField(); i++ {
if reflect.ValueOf(aValues[i]).IsNil() {
resultValues[i] = bValOf.Field(i).Interface()
break
}
resultValues[i] = aValOf.Field(i).Interface()
}
return &result, nil
}

最佳答案

检查这个包https://github.com/imdario/mergo

示例代码:

package main

import (
"fmt"
"github.com/imdario/mergo"
)

type Foo struct {
A string
B int64
}

func main() {
src := Foo{
A: "one",
B: 2,
}
dest := Foo{
A: "two",
}
mergo.Merge(&dest, src)
fmt.Println(dest)
// Will print
// {two 2}
}

在 Playground 上看到它:https://play.golang.org/p/9KWTK5mSZ6Q

关于go - 如何合并两个相同结构类型的 Go 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53878166/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com