Go 语言结构体
与C语言类似,Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。
结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
定义和C有些许差异,c中涉及 typedef (自定义类型) struct,有类型名和标签名概念。
GO语言中结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。type 语句设定了结构体的名称。
- 结构体的格式如下:
type struct_va struct {
data1
data2
…
datan
}
- go语言结构体初始化
package main
import "fmt"
type school struct {
students string
teacher string
leader string
id int
}
func main() {
// 创建一个新的结构体
fmt.Println(school{"LiHua", "LSL", "enheng", 1})
// 也可以使用 key => value 格式
fmt.Println(school{students: "XiaoMing", teacher: "LSL", leader: "enhang", id: 2})
// 忽略的字段为 0 或 空
fmt.Println(school{students: "Xioahong", teacher: "LSL"})
}
API server listening at: 127.0.0.1:43363
{LiHua LSL enheng 1}
{XiaoMing LSL enhang 2}
{Xioahong LSL 0}
Process exiting with code: 0
- 3.struct定义的三种形式
type Student struct {
Name string
age int
}
对于上面这个结构体,我们定义的三种方式有:
var stu student
var stu *Student = new(Student)
var stu *Student = &Student
序列化
struct中的tag,我们可以为struct中的每个字段,写上一个tag。这个tag可以通过反射的机制获取到,json序列化和反序列化
package main
import (
"encoding/json"
"fmt"
)
type Student struct {
Name string
Age int
}
func main() {
var stu Student
stu.Name = "Liming"
stu.Age = 23
data, err := json.Marshal(stu)
if err != nil {
fmt.Printf("json marshal fail fail error:%v", err)
return
}
fmt.Printf("json data:%s\n", data)
}
API server listening at: 127.0.0.1:41758
json data:{"Name":"Liming","Age":23}
Process exiting with code: 0
结构体的比较
可以使用==或!=运算符进行比较,比较两个机构体的每个成员
匿名字段
结构体中字段可以没有名字,匿名字段的用于功能类似C++ java 的功能(继承)
package main
import (
"fmt"
)
type People struct {
Name string
Age int
}
type Student struct {
People
Score int
}
func main() {
var s Student
/*
s.People.Name = "tome"
s.People.Age = 23
*/
//上面注释的用法可以简写为下面的方法
s.Name = "tom"
s.Age = 23
s.Score = 100
fmt.Printf("%+v\n", s)
}
API server listening at: 127.0.0.1:25154
{People:{Name:tom Age:23} Score:100}
Process exiting with code: 0
结构体指针
你可以定义指向结构体的指针类似于其他指针变量,格式如下:
var struct_pointer *Books
以上定义的指针变量可以存储结构体变量的地址。查看结构体变量地址,可以将 & 符号放置于结构体变量前:
struct_pointer = &Book1
使用结构体指针访问结构体成员,使用 “.” 操作符:
struct_pointer.title
package main
import (
"fmt"
)
type Point struct {
X float64
Y float64
}
func (p *Point) ScaleBy(factor float64) {
p.X *= factor
p.Y *= factor
}
func main() {
//两种方法
//方法1
r := &Point{1, 2}
r.ScaleBy(2)
fmt.Println(*r)
//方法2
p := Point{1, 2}
pptr := &p
pptr.ScaleBy(2)
fmt.Println(p)
//方法3
p2 := Point{1, 2}
(&p2).ScaleBy(2)
fmt.Println(p2)
//相对来说方法2和方法3有点笨拙
//方法4,go语言这里会自己判断p是一个Point类型的变量,
//并且其方法需要一个Point指针作为指针接收器,直接可以用下面简单的方法
p3 := Point{1, 2}
p3.ScaleBy(2)
fmt.Println(p3)
}
API server listening at: 127.0.0.1:48540
{2 4}
{2 4}
{2 4}
{2 4}
Process exiting with code: 0