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

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

在那种应用场景下使用?

2596 次点击
所在节点    Go 编程语言
29 条回复
MidGap
2021-09-14 17:14:28 +08:00
这个有啥问题吗 0.0
tyx1703
2021-09-14 17:16:16 +08:00
序列化 json 要导出才行
chaleaoch
2021-09-14 17:18:10 +08:00
@MidGap 我觉得可能是 2 楼的原因.

你有没有考虑过一个私有的结构体, 里面的字段是私有的还是公有的, 其实是没有区别的?'
除非和 Json 中的反射发生关系, 也就是说 ValueOf 只能获取公有的字段.或者...有什么我不知道的特别的场景.
chaleaoch
2021-09-14 17:18:43 +08:00
@tyx1703 大佬是不是可以理解成序列化只对公有字段有效?
tyx1703
2021-09-14 17:27:56 +08:00
@chaleaoch 过誉了,只是经验之谈。

正常来说是的,不过有 hack 的方法

https://stackoverflow.com/questions/11126793/json-and-dealing-with-unexported-fields
chaleaoch
2021-09-14 17:31:06 +08:00
@tyx1703 大佬我又有一个新问题...
https://v2ex.com/t/801812#reply0
iyear
2021-09-14 17:31:43 +08:00
可能是一个第三方包,人家只是想自己在包里调用,不想暴露出去
MidGap
2021-09-14 17:32:15 +08:00
@chaleaoch 字段是私有还是共有的和这个结构体是私有共有的本来也没啥联系吧~~
chaleaoch
2021-09-14 17:33:51 +08:00
@MidGap 一个结构体是私有的, 那他的字段是私有还是公有已经没有区别了, 从可见性角度看. 反正都是包内生效.

除非有什么我不知道的 go 语法规则.
或者像 2 楼说的和 Json/ 反射相关.
MidGap
2021-09-14 18:27:55 +08:00
@chaleaoch 对对对,就是和反射有关系~
cyrivlclth
2021-09-14 19:28:15 +08:00
除了反射,还有场景是提供一个默认的全局变量。。。

var DefaultUserInfo = userInfo{...}

这个 DefaultUserInfo 是可以导出的。

userInfo 也可能是某个结构体的一个字段。
cyrivlclth
2021-09-14 19:29:38 +08:00
还有种就是不希望调用方直接使用 UserInfo{}这样的形式使用,而是使用提供的 New 方法去使用
yin1999
2021-09-14 19:36:00 +08:00
应该是为了序列化使用(包含了 JSON 的 tag ),而这个结构体本身是不导出的,所以正常使用,它里面的字段是不会被包的使用者直接修改的
ihipop
2021-09-14 20:07:11 +08:00
结构体私有不代表不能被外部使用,你可以通过一个 new 函数或者包公共变量把它 return 出去
chaleaoch
2021-09-14 21:25:19 +08:00
@cyrivlclth 大佬 这种骚操作的意义是什么?
chaleaoch
2021-09-14 21:27:01 +08:00
@cyrivlclth 骚操作是指 var DefaultUserInfo = userInfo{...}这个.
=================================
userInfo 也可能是某个结构体的一个字段。
譬如叫结构体 AAA 好了, 那么其他包可以通过 AAA 访问 userInfo 吗?
=================================
还有种就是不希望调用方直接使用 UserInfo{}这样的形式使用,而是使用提供的 New 方法去使用
有道理.
chaleaoch
2021-09-14 21:31:04 +08:00
@ihipop
@cyrivlclth
工厂方法返回了的结构体 类型 是私有的. 那么调用这个工厂方法的变量如何定义, 只能定义成接口了?
有没有具体的例子 请大佬赐教.
chaleaoch
2021-09-14 21:32:19 +08:00
接楼上, "那么调用这个工厂方法的变量如何定义" 没说清楚,
我是指, 调用这个工厂方法的赋值语句需要一个变量接受 New 出来的结构体, 这个变量如何定义. 只有一种可能就是接口.有这么用的么...
cyrivlclth
2021-09-14 22:53:47 +08:00
@chaleaoch 变量定义直接 var 或者 := 就行呀,又不是老版本的 java 不支持 var
chaleaoch
2021-09-14 23:05:20 +08:00
@cyrivlclth 我试了一下真的可以... 有点假

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

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

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

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

© 2021 V2EX