文章

golang学习记录(9)

结构体

1、type关键字

type关键字常用于

定义结构体

定义接口

定义类型别名

类型定义

类型判断

1.1、类型别名

别名可以让使用者更好理解代码,提高代码的可读性和可维护性,在编译的时候,会将别名编译为原来的类型

1
2
3
4
5
//以定义int的别名举例
type MyInt = int
var i MyInt
fmt.Println("%T\n", i)
//上面代码输出的结果为int,相当一给int取了一个小名,MyInt本质上还是int

1.2、自定义类型

自定义类型是一种新的数据类型,它是基于已有的类型(如int、string等)创建的,它可以包含多个字段,每个字段都有自己的名称和类型。自定义类型可以用于创建更复杂的数据结构,以满足特定的需求。

1
2
3
4
type MyInt int // 相比于类型别名,没有等号
var i MyInt
fmt.Println("%T\n", i)
//上面代码输出的结果为xxxx.MyInt

自定义类型有什么意义?

可以给数据类型增加方法,使用更加灵活

1
2
3
4
5
6
7
8
9
func (mi MyInt) string() string{
    return strconv.Itoa(int(mi))
}

func main(){
    var i MyInt = 10
    fmt.Println(i.string())
}
// 上面的代码给MyInt增加了一个string方法,这样就可以将MyInt类型转换为string类型

2、结构体的定义和初始化

go中的结构体借鉴了面向对象的特性和C语言结构体的简洁性

假设要设计一个结构体存储个人信息,包括name、age、address、mobile等,那么可以使用如下方式定义结构体:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
type Person struct{
    name string
    age int
    address string
    mobile string
}

func main(){
    //结构体的初始化方式
    p1 := Person{"小明", 18, "北京", "13812345678"} //省略写法每个元素都要写
    p2 := Person{name: "小红", age: 19, address: "上海", mobile: "13812345679"} //能够填部分元素,更灵活
    var p3 Person
    p3.name = "小刚"

    var persons []Person
    persons = append(persons, p1)
    persons = append(persons, Person{"小刚", 20, "广州", "13812345680"})
}

3、匿名结构体

定义临时的一次性的结构体

1
2
3
4
5
6
7
8
9
10
11
address := struct{
    province string
    city string
    district string
}{
    "北京",
     "北京", 
     "海淀区"
}
fmt.Println(address.city)

4、结构体嵌套

结构体可以在一个结构体中嵌套另一个结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
type Person struct{
    name string
    age int
}
// 可以不用重复定义
type Student struct{
    // 第一种嵌套方式
    p Person
    score float32
}

func main() {
    // 第一种初始化方式
    s := Student{
        p: Person{
            name: "小明",
            age: 18,
        },
        score: 90,
    }
    fmt.Println(s.p.name)

    // 第二种初始化方式
    s := Student{}
    s.p.name = "小明"
}

匿名嵌套

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
type Person struct{
    name string
    age int
}
// 可以不用重复定义
type Student struct{
    // 第二种嵌套方式--匿名嵌套
    Person
    score float32
}

func main() {
    // 初始化方式
    s.name = "小明"
}

5、结构体 定义 “方法”

给结构体定义一个方法

在go中定义结构体的方法是在结构体外进行定义的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
type Person struct{
    name string
    age int
}

func (p Person) print(){
    fmt.Printf("姓名:%s, 年龄:%d\r\n", p.name, p.age)
}

func main() {
    p := Person{
        name: "小明",
        age: 18,
    }
    p.print()
}

想要在结构体方法中修改结构体的属性,需要使用指针类型的结构体

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
type Person struct{
    name string
    age int
}

func (p *Person) print(){
    p.age = 19
    fmt.Printf("姓名:%s, 年龄:%d\r\n", p.name, p.age)
}

func main() {
    p := Person{
        name: "小明",
        age: 18,
    }
    p.print()
}
//此时输出的结果为:姓名:小明, 年龄:19
本文由作者按照 CC BY 4.0 进行授权