跳转至

12.结构体

go语言提供了和C语言类似的结构体。

声明

Go语言中的结构体变量和C语言一样,有两种声明方式:

1.直接声明变量

var myStruct struct{
    member1 int64
    member2 float64
}

2.使用type先声明类型

type MyStruct struct{
    member1 int64
    member2 float64
}

Note

go语言结构体中的成员变量名也遵循首字母大小写导出规则,当首字母时大写时,可以被外部包访问,但小写开头的成员变量则不能被外部包直接访问。

访问成员变量

和C语言一样,直接使用<变量名>.<成员变量名>即可。

Note

go语言中的结构体可以直接用fmt.Print()等直接打印,结果格式如下:
{memberValue1, memberValue2, ...}

对于格式化打印,可以使用%v输出上述格式,也可以使用%+v同时输出成员变量名。

结构体字面值

可以使用如下的写法来表示一个结构体的字面值:

<structName>{<memberName1>: <value1>, <memberName2>: <value2>, ...}
// 或者更简洁的方式
<structName>{<value1>, <value2>, ...}

Note

上述两个字面值,前者可以允许任意顺序的成员变量,而后者必须按照成员变量的顺序。

当某个成员变量没有值时,默认为相应类型的零值。

结构体之间的赋值

go语言中的结构体和C语言一样,是实际变量,故相互赋值时,会将整个数据复制一份,各变量之间互不影响。

结构体编码Json

go语言提供了一个包encoding/json,其中的Marshal函数可以将结构体转化为Json字符串。

使用方法:

import "encoding/json"
...
    bytes, err := json.Marshal(<structVariable>)
    jsonString = string(bytes)
    fmt.Println(jsonString)
...

Note

当使用json.Marshal时,需要注意结构体的成员变量的可见性,只有对外部可见的成员变量在转换后才会显示在json中。

如果需要转换的json中的键必须不是大写开头的,则需要使用标签功能标记,如:

type myStruct struct{
    V1 int64 `json:"myJsonKeyName"`
}
当上述结构被解析为json时,会使用标签中的名称。go语言还提供了转换为xml的函数,同理,如果需要转换为xml并指定名称,同时指定json的名称,则可以这样写:
type myStruct struct{
    V1 int64 `json:"myJsonKeyName"xml:"myXmlKeyName"`
}