Golang:如何对不同的结构使用相同的方法

Golang: How to use same the method for different structures

如何将相同的逻辑应用于不同的结构?

例如,更新结构的字段。 我想为结构 A 和 B

共享相同的 UpdateName 逻辑

A 和 B 来自不同的包。

// model/A.go
type A struct {
   name  string
   total int64
   date  time.Time
}
// model/B.go
type B struct {
   name  string
   price float64
   total int64
   date  time.Time
}

希望把重复的逻辑合并为一个。

// service/a.go
func UpdateName(data *A) {
   data.Name = "NEW"
}

// service/b.go
func UpdateName(data *B) {
   data.Name = "NEW"
}

我想使用一个接口来解耦。
此外,如何将接口解析为参数。

type DataSetter() interface {
    SetName(name string)
    SetTotal(total int64)
}

感谢您帮我解决这个基本问题。

对于像您展示的那样简单的赋值,通常最好只公开字段:

type A struct {
   Name string
   ...
}

...
func f(a *A) {
   a.Name="x"
}

您可以考虑嵌入一个通用结构:

type Common struct {
   Name string
}

func (c *Common) SetName(s string) {
   c.Name=s
}


type A struct {
   Common
   ...
}

type B struct {
   Common
   ...
}

func f(a *A) {
   a.SetName("x")
}

可以使用表示通用类型函数的接口:

type WithName interface {
   SetName(string)
}


func f(x WithName) {
   x.SetName("x")
}


func g(a *A) {
   f(a)
}

func h(b *B) {
   f(b)
}

但您不会只想 SetName.

这样做