# 结构体 struct

# 1. 简介

结构体是将多个数据组成一个整体的结构。

type student struct {
    name string
    age int
}

上面例子是,声明了一个 struct 结构,名字叫 student, 这个结构包含两个属性,名字(name)和年龄(age)。

s1 := student{"Jerry", 15}

上面实例中,初始化了一个 s1 结构体,基于 student,初始化了属性,Jerry 赋给属性 name,15 赋给属性 age

也可以使用 new 函数创建结构体。

s2 := new(student)

s2*student 类型值指针,指针相关会面会介绍。

s1.name // Jerry
s1.age // 15

访问结构体的属性时,用名字加 . 加属性名进行访问,也可以直接打印结构体。

fmt.Println(s1)
// {Jerry 15}

结构体也可以作为函数的参数,下面实例中,结构体作为函数的参数。

func printStu(s student) {
    fmt.Println(s.name)
    fmt.Println(s.age)
}

也可以作为函数的返回值。

func printStu(s student) {
    fmt.Println(s.name)
    fmt.Println(s.age)
}

# 2. 复制 struct

struct 被实例化时,分配内存。

struct 结构算是基础类型,我们将一个 struct 赋值给另一个 struct 时,会产生独立的变量,两个 struct 互不影响。

s1 := student{"Jerry", 15}

s2 := s1
s1.Name = "Tom"

fmt.Println(s1.Name) // Jerry
fmt.Println(s2.Name) // Tom

struct 作为函数的参数传入,函数内部获取复制的另一份。

# 3. struct 指针

可以使用 sutruct 指针保存结构体。

s1 := student{"Jerry", 15} // s1 是 student 结构体
s2 := &student{"Jerry", 15} // s2 是 *student 指针

上面实例中,先初始化了一个结构体,把结构体的地址存到 s2 指针中。

可以通过 . 访问结构体的属性,指针也可以访问,在 C 语言中使用 -> 符号。

s1.name // Jerry
s2.name // Jerry 
// 等价于 
(*s2).name

在 Go 语言中 s2.name(*s2).name 是等价的。

# 4. struct 转换

struct 可以转化为其他类型,可以转为以下类型。

  • JSON
  • 二进制数组

(1)struct 转 JSON

encoding/json 包中提供了 struct 转 JSON 函数,使用前需要引入。

import "encoding/json"

使用 json 中的 Marshal 函数完成转换,该函数返回两个变量,第一个是数据,二进制数组,第二个变量是发生的错误,转换成功,返回 nil

s1 := student{"Jerry", 15}
bytes, e := json.Marshal(s1)

if e == nil {
    fmt.Println(string(bytes))
    // {"name":"Jerry","age":15}
}

# 5. 方法

方法也是一个函数,跟函数的区别是,方法可以跟结构体关联。

func (s student) printStu(){
    fmt.Println(s)
}

上面实例是给 student 结构体绑定了一个方法,func 关键字后面填写绑定的结构体。

s1 := student{"Jerry", 15}

s1.printStu() // {Jerry 15}

使用是结构体 . 方法名来访问。

在方法中可以访问结构体的每个成员,下面实例中分别打印了结构体的成员。

func (s student) printStu(){
    fmt.Println(s.Name)
    fmt.Println(s.Age)
}

方法也可以有参数和返回值,这些跟普通函数一样。

更新时间: 12/26/2021, 1:44:08 PM