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
.
这样做
如何将相同的逻辑应用于不同的结构?
例如,更新结构的字段。 我想为结构 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
.