为了账号安全,请及时绑定邮箱和手机立即绑定

对 Go 中的某些数据结构语法感到困惑

对 Go 中的某些数据结构语法感到困惑

Go
守候你守候我 2022-08-15 16:59:10
在过去的几周里,我一直在学习围棋。来自Python和Erlang,我喜欢这门语言,它的简单性和严格性。然而,在结构和解析YAML方面有一些语法“东西”,我对此感到困惑。这是我的 yml 配置。例如:server:  host: 127.0.0.1  port: 8080  path: /some/silly/path我看到人们声明的结构如下:    Server struct {        Host string `yaml:"host"`        Path string `yaml:"path"`        Port string `yaml:"port"`            } `yaml:"server"`}我也看到这个:    Server struct {        Host string `yaml:"host"`        Path string `yaml:"path"`        Port string `yaml:"port"`    }}在服务器结构声明的末尾添加 yaml:“server” 有什么意义?
查看完整描述

1 回答

?
慕标5832272

TA贡献1966条经验 获得超4个赞

下面是一个 JSON 示例,因为它是内置的:


package main


import (

   "encoding/json"

   "fmt"

)


func main() {

   s := `

   {

      "server": {"host": "127.0.0.1", "path": "/some/silly/path", "port": 8080}

   }

   `

   var config struct {

      Server struct {

         Host, Path string

         Port int

      }

   }

   json.Unmarshal([]byte(s), &config)

   fmt.Printf("%+v\n", config)

}

所以正如你所注意到的,我根本没有使用任何标签。规则在这里:


要将 JSON 取消到结构中,Unmarshal 将传入的对象键与 Marshal 使用的键(结构字段名称或其标记)匹配,首选完全匹配,但也接受不区分大小写的匹配。


https://golang.org/pkg/encoding/json/#Unmarshal


因此,只要 JSON 键与结构字段匹配(无论大小写如何),您就不需要标签。否则,您就会这样做。通常,您可以避免使用标记,除非您只想在结构中使用其他标记,或者如果 JSON 键具有连字符,例如:


{"need-tag-for-this": 10}


查看完整回答
反对 回复 2022-08-15
  • 1 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号