V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
clker
V2EX  ›  Go 编程语言

初学 golang, 请教一个问题

  •  
  •   clker ·
    clker · 2017-10-10 23:01:15 +08:00 · 1838 次点击
    这是一个创建于 2382 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 后是空啊

    16 条回复    2017-10-24 17:28:59 +08:00
    zwpaper
        1
    zwpaper  
       2017-10-10 23:14:56 +08:00 via iPhone   ❤️ 1
    为什么你们都喜欢把 error 忽略了,然后问为什么会出问题?
    zwpaper
        2
    zwpaper  
       2017-10-10 23:16:39 +08:00 via iPhone   ❤️ 1
    这个问题是因为 struct 里要 json 化的变量需要大写
    lizon
        3
    lizon  
       2017-10-10 23:19:51 +08:00   ❤️ 1
    导出变量才会被序列化

    首字母大写的变量是导出变量
    Sapp
        4
    Sapp  
       2017-10-10 23:52:59 +08:00 via Android   ❤️ 1
    记住了,不大写是无法外部使用的。
    trys1
        5
    trys1  
       2017-10-11 01:16:37 +08:00 via Android
    @zwpaper 1 楼才是正解
    clker
        6
    clker  
    OP
       2017-10-11 06:20:39 +08:00
    谢谢各位大大,首字母大写。记住了。
    Immortal
        7
    Immortal  
       2017-10-11 08:52:42 +08:00   ❤️ 1
    @clker 不是首字母大写 是要序列化的结构体要是能导出的
    zdt3476
        8
    zdt3476  
       2017-10-11 09:17:15 +08:00   ❤️ 1
    话说相对于可导出这个问题来说,check error 才是关键吧
    zwpaper
        9
    zwpaper  
       2017-10-11 09:57:58 +08:00 via iPhone   ❤️ 1
    @clker 就像大家说的,首字母没大写这个问题还好,你能发现,忽略 error 的话,跑着跑着莫名 panic 了,估计你就蒙了
    HarrisonZ
        10
    HarrisonZ  
       2017-10-11 10:31:49 +08:00
    还是先把官网的教程认真看一遍吧
    clker
        11
    clker  
    OP
       2017-10-11 12:00:36 +08:00
    非常感谢各位!
    HMSQQbA
        12
    HMSQQbA  
       2017-10-11 21:14:26 +08:00
    请教一下代码怎么贴出来的?我用 gist 法无法做到,只能显示一个按钮。
    clker
        13
    clker  
    OP
       2017-10-12 08:33:23 +08:00 via Android
    @HMSQQbA 用 markdown 啊,发主题时右下角有选择
    HMSQQbA
        14
    HMSQQbA  
       2017-10-12 18:54:08 +08:00
    @clker 谢谢啊
    jpuyy
        15
    jpuyy  
       2017-10-24 10:03:26 +08:00
    1 楼是正解
    YakuMioto
        16
    YakuMioto  
       2017-10-24 17:28:59 +08:00
    你们好好看看代码, 人家怎么没有 check error 了? 小写不导出会报错么? ... 真的是服气 说 1L 正解的人....
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2839 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:35 · PVG 21:35 · LAX 06:35 · JFK 09:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.