golang 中私有结构体包含公有字段的目的是什么?

2021-09-14 17:12:39 +08:00
 chaleaoch

在那种应用场景下使用?

2609 次点击
所在节点    Go 编程语言
29 条回复
cyrivlclth
2021-09-14 23:11:35 +08:00
@chaleaoch =。=你说的那种骚操作我在公司项目中看到过,写这个的人美曰其名是隔离(因为那个 package 导入之后,你按.之后的提示不会有 userInfo,只会有一个 DefaultUserInfo ),但其实在我看来就是没啥大用,就只是本来那个只需要用一次,就定义匿名结构体,但是匿名结构体写法又太难受了,就整个私有但是有公有字段的结构体出来。

但大部分这种情形都是为了反射。
cyrivlclth
2021-09-14 23:13:09 +08:00
@chaleaoch 哦,对了,我们那个变量名叫 DefaultConfig,是从 toml 文件解析,所以还真得用公有字段
chaleaoch
2021-09-14 23:13:56 +08:00
@cyrivlclth 谢谢 还剩一个问题 我本地试了一下. 大概明白了 大小写隔离的 是类似链接的功能 并不是内存级别的隔离. 只要我能看见你我就能用你, 而不是从内存检查你到底是否是可见的.
学到了学到了. 谢谢大佬指点.
XTTX
2021-09-15 09:34:41 +08:00
上面的答案都不全。struct 里使用 custom type,同时需要自己写符合 marshal unmarshal function signature 的 method.
XTTX
2021-09-15 09:35:31 +08:00
============================================
XTTX
2021-09-15 09:45:54 +08:00
你要 unmarshal users.Permissions 就必须提供
func (u *users.Permissions) UnMarshalJSON() ([]byte, error) { }
func (u *users.Permissions) MarshalJSON(data []byte) error { }

你在 marshal 整个 UserInfo 的时候,你提供的针对 users.Permissions 的 marshaller 会自动被调用。
============================================================

比如,很多时候 users.Permissions 是 null, 你不提供上述 method, 整个 marshal 过程会报错。
XTTX
2021-09-15 09:47:08 +08:00
=================================================
// NullString is an alias for sql.NullString data type
type NullString struct {
sql.NullString
}

// MarshalJSON for NullString
func (ns *NullString) MarshalJSON() ([]byte, error) {
if !ns.Valid {
return []byte("null"), nil
}
return json.Marshal(ns.String)
}

// UnmarshalJSON for NullString
func (ns *NullString) UnmarshalJSON(b []byte) error {
err := json.Unmarshal(b, &ns.String)
ns.Valid = (err == nil)
return err
}
===================================================

type ArticleAction struct {
ID int `db:"articleaction_id" json:"id"`
Notes NullString `db:"notes,omitempty" json:"notes,omitempty"`
}
chaleaoch
2021-09-15 09:49:38 +08:00
@XTTX 所以说白了还是和 json 序列化有关系.
XTTX
2021-09-15 09:55:40 +08:00
@chaleaoch 不然原作者写那么多 json tags 做什么。 数据自产自销不用提供 json tags

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/801805

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX