go语言学习心得2

Unmarshal json 2 custom define object

心得总结

according to test case, we reached the following conclusions:
no mater what format of source json field value, (It may be a variety of situations as follows)
    1. Initials: 'Devicetype'
    2. ALL CAPS: 'DEVICETYPE'
    3. All lowercase: 'devicetype'
    4. Capitalize the first letter of each word: 'DeviceType'

Unmarshal json to object, the define of object 's json part can only be defined as:
    `json:"devicetype"`


#中文简要总结
1. 首字母大写
2. 全部大写
3. 全部小写
4. 每单词首字母大写
5. ...

映射到自定义的结构体上时,json部分的写法只需要写成 
`json:"全部小写"` 即可

eg:

`json:devicetype`

测试case

func Test_UT_MarshalAndUnmarshal(t *testing.T) {
    jsonData := `{"ASW-2C-03.SQA.TBC":{"Attributes":{"Devicetype":"network_device","ExpectedLink":"expectedLinkValue","Hostname":"ASW-2C-03.SQA.TBC","ID":"ASW-2C-03.SQA.TBC","Ip":"10.104.46.8","manufacturer":"h3c","Model":"WS-C3560G-24TS","Sn":"bbd20dfd-5260-45f0-936a-5b13c4c571c0","uplinkinfo":"uplink_info"}}}`

    type APIServer2TempItem struct {
        Id           string `json:"id"`
        Ip           string `json:"ip"`
        Model        string `json:"model"`
        Sn           string `json:"sn"`
        Manufacturer string `json:"manufacturer"`
        UplinkInfo   string `json:"uplinkinfo"`
        ExpectedLink string `json:"expectedlink`
        DeviceType   string `json:"devicetype"`
    }

    var m map[string]map[string]*APIServer2TempItem = make(map[string]map[string]*APIServer2TempItem)

    bytes := []byte(jsonData)
    json.Unmarshal(bytes, &m)
    expected, ok := m["ASW-2C-03.SQA.TBC"]["Attributes"]
    assert.Equal(t, ok, true)
    expectedValue := "network_device"
    assert.Equal(t, expected.DeviceType, expectedValue)

    expectedValue = "expectedLinkValue"
    assert.Equal(t, expected.ExpectedLink, expectedValue)

    expectedValue = "ASW-2C-03.SQA.TBC"
    assert.Equal(t, expected.Id, expectedValue)

    expectedValue = "10.104.46.8"
    assert.Equal(t, expected.Ip, expectedValue)

    expectedValue = "h3c"
    assert.Equal(t, expected.Manufacturer, expectedValue)

    expectedValue = "WS-C3560G-24TS"
    assert.Equal(t, expected.Model, expectedValue)

    expectedValue = "bbd20dfd-5260-45f0-936a-5b13c4c571c0"
    assert.Equal(t, expected.Sn, expectedValue)

    expectedValue = "uplink_info"
    assert.Equal(t, expected.UplinkInfo, expectedValue)
}

<think>好的,用户想分享或获取关于学习Go语言的经验和心得。首先,我需要整理现有的引用内容,看看里面有哪些关键点。引用1提到选择合适的学习资源,引用2推荐了一本书作为教材,引用3强调实践编程的重要性,引用4则详细讲述了PHP转Go的经历,包括需要巩固基础知识以及分阶段学习的过程。 用户的问题是关于学习Go心得和经验分享,所以应该涵盖学习资源、学习方法、实践项目、常见挑战以及进阶路径等方面。需要确保结构清晰,分点说明,这样用户容易理解。同时,要注意引用对应的参考文献,比如提到基础知识时引用4,提到实践时引用3,书籍推荐引用2,学习资源引用1。 可能还需要考虑用户的不同背景,比如是否有其他语言经验,是否需要强调转语言的注意事项,如引用4中的PHP转Go的情况。此外,应该加入一些实际的学习步骤,比如从基础语法到项目实战的路径,以及推荐的学习社区或工具。 需要检查是否有遗漏的信息,比如是否提到了Go语言的优势,如并发模型、简洁语法等,这些也是学习心得中的重要部分。同时,要确保回答符合用户的需求,可能用户希望得到具体的建议,而不仅仅是理论上的指导。 最后,生成相关问题时要围绕学习资源、方法、项目、转语言经验等,帮助用户进一步深入探索。比如如何巩固基础知识,如何选择项目,如何处理转语言的挑战等。确保问题具有针对性,能够引导用户继续学习。</think>### Go语言学习心得与经验分享 #### 1. 学习路径规划 Go语言以简洁的语法和高效的并发模型著称。建议从**基础语法**入手,逐步掌握$goroutine$、$channel$等核心特性。推荐先学习《Go语言编程》等教材[^2],并结合官方文档进行对照学习。基础阶段可重点关注: - 变量声明与作用域:$var\ x\ int\ =\ 10$ 与短声明$:=$的区别 - 接口与结构体:理解$interface\{\}$的设计哲学 - 错误处理:$error$接口与多返回值机制 #### 2. 实践驱动学习 如引用[3]所述,**动手编程**是掌握Go的最佳方式。建议: 1. 从CLI工具开发开始(如文件批量重命名工具) 2. 实现TCP/UDP通信程序(需理解$net$包) 3. 构建RESTful API服务(使用Gin或Echo框架) ```go // 简单的HTTP服务示例 package main import "github.com/gin-gonic/gin" func main() { r := gin.Default() r.GET("/", func(c *gin.Context) { c.String(200, "Hello Go!") }) r.Run(":8080") } ``` #### 3. 关键难点突破 - **并发编程**:理解$select$语句和缓冲通道 - **内存管理**:通过$pprof$工具分析内存分配 - **依赖管理**:掌握Go Modules的使用方法 建议通过《Concurrency in Go》等专项书籍深化理解。 #### 4. 转语言注意事项 PHP开发者需特别注意(如引用[4]所述): 1. 强化**系统编程**基础:理解进程/线程模型 2. 掌握指针操作:$*\&$符号的使用场景 3. 适应强类型系统:避免动态类型的惯性思维 4. 学习调试工具:$dlv$调试器的使用 #### 5. 进阶路线建议 1. 阅读标准库源码(如$sync$、$context$包) 2. 参与开源项目(可关注Kubernetes生态) 3. 研究高性能优化技巧(内存对齐、池化技术) 4. 学习云原生相关技术(Docker、K8s集成)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值