gpt4 book ai didi

Go Getter 方法与字段,正确命名

转载 作者:IT王子 更新时间:2023-10-29 01:04:52 25 4
gpt4 key购买 nike

在 Effective Go 中,它是 clearly stated在未导出字段(以小写字母开头)的情况下,getter 方法应具有相同的字段名称但以大写字母开头;他们给出的示例是 owner 作为字段,Owner 作为方法。他们明确建议不要在 getter 方法名称前使用 Get

我经常遇到需要导出字段以进行 JSON 编码、与 ORM 一起使用或其他与反射相关的目的(IIRC 反射可以读取但不能修改未导出的字段)的情况,因此我的字段需要被称为 Owner 在上面的例子中,因此不能有 Owner 方法。

是否有一种惯用的命名方式可以解决这种情况?

编辑:这是我遇到的具体示例:

type User struct {
Username string `db:"username" json:"username"`
// ...
}

// code in this package needs to do json.Unmarshal(b, &user), etc.

.

// BUT, I want code in other packages to isolate themselves from
// the specifics of the User struct - they don't know how it's
// implemented, only that it has a Username field. i.e.
package somethingelse

type User interface {
Username() string
}

// the rest of the code in this other package works against the
// interface and is not aware of the struct directly - by design,
// because it's important that it can be changed out without
// affecting this code

最佳答案

如果您的字段已导出,请不要使用 getter 和 setter。这只会混淆界面。

如果你需要一个 getter 或 setter 因为它做了一些事情(验证、格式化等),或者因为你需要结构来满足接口(interface),那么不要导出底层字段!

如果为了 JSON、数据库访问等需要一个导出字段,您需要一个 getter/setter,然后使用两个结构,一个导出,一个私有(private),并定义一个自定义公共(public)的 JSON 编码(marshal)拆收器(或数据库访问方法):

type jsonFoo struct {
Owner string `json:"owner"`
}

type Foo struct {
owner string
}

func (f *Foo) SetOwner(username string) {
// validate/format username
f.owner = username
}

func (f *Foo) Owner() string {
return f.owner
}

func (f *Foo) MarshalJSON() ([]byte, error) {
return json.Marshal(jsonFoo{
Owner: f.owner,
})
}

关于Go Getter 方法与字段,正确命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45189126/

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