gpt4 book ai didi

go - 对具有大量指针(尤其是数字)的结构进行操作

转载 作者:行者123 更新时间:2023-12-05 08:13:05 30 4
gpt4 key购买 nike

我有很多主要包含数字的数据结构,我获取数据,进行计算并返回结果。

问题是所有这些数字都可以为零,因此,我不得不切换到使用指针(*int64*float64),这样默认值是nil 而不是 0

不幸的是,除了使用指针,我不知道在 Go 中有解决这个问题的方法。

现在问题出现在为所有数据结构实现的 Calculate() 函数中:

type X struct {
A, B, C, D, E, F *int
// and much more

Result *float64
}

func (x *X) Calculate() {
floatptr := func(f float64) *float64 { return &f }
x.Result = floatptr(float64(*x.A + *x.B + *x.C + *x.D + *x.E + *x.F))
}

如果任何数据为 nil,此函数显然会 panic。因此,我编写了不同的函数,它在计算之前检查 nil 数据:

func (x *X) CalculateWithNilChecks() {
floatptr := func(f float64) *float64 { return &f }
if x.A == nil || x.B == nil || x.C == nil || x.D == nil || x.E == nil || x.F == nil {
return
}
x.Result = floatptr(float64(*x.A + *x.B + *x.C + *x.D + *x.E + *x.F))
}

问题是数据结构很长。超长的 if x != nil 看起来很难看。我想知道是否有另一种(更清洁的)方法来做到这一点。


  • 我想像在 encoding/json 中那样做,然后只是 recover nil pointer dereference panic ,不确定这是否更清晰 TBH。
  • 另一个想法是反射(reflect)数据结构并在任何所需数据为 nil 时停止,我认为对于这样一个简单的任务来说这不是必需的。

Here is a playground link for the above code

我在这里错过了什么?谢谢!

最佳答案

作为通用解决方案,您可以将 JSON 解码为 *int 指针或 json.RawMessage 的映射,然后使用反射与您的结构进行交叉检查或仅检查它具有预期的字段数。

func main() {
result := make(map[string]*int)
str := `{ "A": 1, "B": 2, "C": 3, "D": 4, "E": 5, "F": 6 }`
json.Unmarshal([]byte(str), &result)
for _, field := range result {
// Check if expect fields exists using reflection or manually
// ...
}
}

关于go - 对具有大量指针(尤其是数字)的结构进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71951154/

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