初学 golang, 请教一个问题

2017-10-10 23:01:15 +08:00
 clker
package main

import (
	"encoding/json"
	"fmt"
)

type A struct {
	a int `json:"a"`
}

type B struct {
	b int `json:"b"`
	a []A `json:"a"`
}

func main() {
	var a A
	var b B
	a.a = 1
	b.b = 2
	//b.a = make([]A, 2)
	b.a = append(b.a, A{2})
	b.a = append(b.a, A{3})

	s1, err := json.Marshal(&a)
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println("1", a)
		fmt.Println("1", string(s1))
	}

	s2, _ := json.Marshal(b)
	fmt.Println("2", b)
	fmt.Println("2", string(s2))

}

得到的结果是:
1 {1}
1 {}
2 {2 [{2} {3}]}
2 {}

为何 json.Marshal 后是空啊

1954 次点击
所在节点    Go 编程语言
16 条回复
zwpaper
2017-10-10 23:14:56 +08:00
为什么你们都喜欢把 error 忽略了,然后问为什么会出问题?
zwpaper
2017-10-10 23:16:39 +08:00
这个问题是因为 struct 里要 json 化的变量需要大写
lizon
2017-10-10 23:19:51 +08:00
导出变量才会被序列化

首字母大写的变量是导出变量
Sapp
2017-10-10 23:52:59 +08:00
记住了,不大写是无法外部使用的。
trys1
2017-10-11 01:16:37 +08:00
@zwpaper 1 楼才是正解
clker
2017-10-11 06:20:39 +08:00
谢谢各位大大,首字母大写。记住了。
Immortal
2017-10-11 08:52:42 +08:00
@clker 不是首字母大写 是要序列化的结构体要是能导出的
zdt3476
2017-10-11 09:17:15 +08:00
话说相对于可导出这个问题来说,check error 才是关键吧
zwpaper
2017-10-11 09:57:58 +08:00
@clker 就像大家说的,首字母没大写这个问题还好,你能发现,忽略 error 的话,跑着跑着莫名 panic 了,估计你就蒙了
HarrisonZ
2017-10-11 10:31:49 +08:00
还是先把官网的教程认真看一遍吧
clker
2017-10-11 12:00:36 +08:00
非常感谢各位!
HMSQQbA
2017-10-11 21:14:26 +08:00
请教一下代码怎么贴出来的?我用 gist 法无法做到,只能显示一个按钮。
clker
2017-10-12 08:33:23 +08:00
@HMSQQbA 用 markdown 啊,发主题时右下角有选择
HMSQQbA
2017-10-12 18:54:08 +08:00
@clker 谢谢啊
jpuyy
2017-10-24 10:03:26 +08:00
1 楼是正解
YakuMioto
2017-10-24 17:28:59 +08:00
你们好好看看代码, 人家怎么没有 check error 了? 小写不导出会报错么? ... 真的是服气 说 1L 正解的人....

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

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

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

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

© 2021 V2EX