gpt4 book ai didi

go - 使用来自其父级的方法更改嵌入式结构的属性

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

我必须定期调用父结构的方法,但在调用时,它必须更新嵌入式结构特有的扩展属性(在我的例子中,结构具有不同的 id 数据类型)。

我能想到的唯一解决方案是覆盖父结构的 a 方法,以便在再次调用周期性方法时,它使用嵌入结构的方法而不是父结构的原始方法。

代码如下:

package main

import (
"fmt"
)

type Fruit struct {
image *Image
tree *Tree

SetImage func(*Image)
SetTree func(*Tree) // #2 (always nil for Strawberry)
}

func NewFruit() *Fruit {
f := &Fruit{}
f.SetImage = f.setImage
f.SetTree = f.setTree
return f
}

func (f *Fruit) Image() *Image {
return f.image
}
func (f *Fruit) Tree() *Tree {
return f.tree
}

func (f *Fruit) setImage(i *Image) {
f.image = i
}
func (f *Fruit) setTree(t *Tree) {
f.tree = t
}

type Strawberry struct {
*Fruit
id int
}

func NewStrawberry(f *Fruit) *Strawberry {
strawberry := &Strawberry{Fruit: f}
return strawberry
}
func (s *Strawberry) SetID(i int) {
s.id = i
}
func (s *Strawberry) ID() int {
return s.id
}
func (s *Strawberry) setImage(i *Image) {
s.id = 6
s.image = i
}

type Kiwi struct {
*Fruit
id string
}

func NewKiwi(f *Fruit) *Kiwi {
kiwi := &Kiwi{Fruit: f}
return kiwi
}
func (k *Kiwi) SetID(i string) {
k.id = i
}

func (k *Kiwi) ID() string {
return k.id
}
func (k *Kiwi) setImage(i *Image) {
k.id = "abc"
k.image = i
}
func (k *Kiwi) setTree(t *Tree) {
k.tree = t
}

type Image struct {
path string
}

type Tree struct {
height int
}

func main() {
f := NewFruit()
f.SetImage(&Image{"kiwi1.jpg"})

/*s := NewStrawberry(f)
s.SetImage = s.setImage
fmt.Println(s, s.ID(), s.Image())
f.SetImage(&Image{"strawberry.jpg"})
fmt.Println(s, s.ID(), s.Image())*/

k := NewKiwi(f)
k.SetImage = k.setImage
k.SetTree = k.setTree
fmt.Println(k, k.ID(), k.Image())
f.SetImage(&Image{"kiwi2.jpg"})
f.SetTree(&Tree{2})
fmt.Println(k, k.ID(), k.Image(), k.Tree())
}

虽然上面的代码确实有效,但当父结构 Fruit 需要例如时,我有两个问题。 10 个附加属性及其所需的 SetXXX(*XXX) 方法:

  1. 然后必须更新所有嵌入式结构以反射(reflect)新的父结构方法。这似乎每个属性都有很多必要的编码。

  2. 其中一些嵌入式结构不需要所有的属性方法,留下一些nil。一个很好的例子是并非所有的水果都长在树上。将属性保留在注释 #2Strawberry 无用。

这两个问题都成立吗?我有什么办法可以避免这些问题吗?

附言应用程序需要大量的操作吞吐量,因此理想情况下,代码应该是类型安全和最佳的,而不使用反射和过度使用类型断言(不能使每个属性都接口(interface){})。

最佳答案

Are both these concerns valid and is there a way I can avoid them?

不,是。

只需编写惯用的 GO,不要尝试用 Go 编写传统的 OO。例如。 Setter 和 Getters 在 Go 中并不常见。并且停止将嵌入视为父/子关系。

关于go - 使用来自其父级的方法更改嵌入式结构的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45909197/

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