【Golang系列】-结构体指针

2022-03-17

结构体指针

结构体指针和普通变量指针相同,先回顾一下普通变量指针:

package main

import "fmt"

func main() {
    var name string
    name = "caolihui"

    var p_name *string //指针类型
    p_name = &name //取name地址

    fmt.Println(name)
    fmt.Println(p_name) //输出指针地址
    fmt.Println(*p_name) //输出指针指向指向内容值
}

go结构体指针

package main

import "fmt"

func main() {
    type Person struct {
        id   int
        name string
    }
    caolihui := Person{
        id:   1,
        name: "caolihui",
    }

    var p_persion *Person
    p_persion = &caolihui

    fmt.Println(caolihui)
    fmt.Println(p_persion)
    fmt.Println(*p_persion)
}

使用new挂件自创建结构体指针
我们还可以通过使用new关键字对结构体进行实例化,得到的式结构体的地址

package main

import "fmt"

func main() {
    type Person struct {
        id   int
        name string
    }
    
    var p_persion = new(Person)
    fmt.Println(p_persion)

}

访问结构体指针成员

package main

import "fmt"

func main() {
    type Person struct {
        id   int
        name string
    }

    var p_persion = new(Person)

    fmt.Println(p_persion)

    p_persion.id = 1
    p_persion.name = "caolihui"

    fmt.Println(*p_persion)

}

结构体作为函数参数

go结构体可以和普通变量 一样,作为函数传参,传递给函数,分两种情况
直接传递结构体,这是一个拷贝,在函数内部不会改变外面结构体的内容
传递结构体指针,这时在函数内部,能够改变外部结构体内容

直接传递结构体

package main

import "fmt"

type Person struct {
    id   int
    name string
}

func showPerson(person Person) {
    person.id = 1
    person.name = "caolihui"
    fmt.Println(person)
}

func main() {
    person := Person{1, "tom"}
    fmt.Println(person)
    fmt.Println("------------")

    showPerson(person)
    fmt.Println("-----------")

    fmt.Println(person)
}

结果:

{1 tom}
------------
{1 caolihui}
-----------
{1 tom}

从运行结果看的话,函数内部改变了结构体内容,函数外并没有被改变

传递结构体指针

package main

import "fmt"

type Person struct {
    id   int
    name string
}

func showPerson(person *Person) {
    person.id = 1
    person.name = "caolihui"
    fmt.Println(person)
}

func main() {
    person := Person{1, "tom"}
    fmt.Println(person)
    fmt.Println("------------")

    showPerson(&person)
    fmt.Println("-----------")

    fmt.Println(person)
}

结果:

{1 tom}
------------
&{1 caolihui}
-----------
{1 caolihui}

从结果看,调用函数后,参数被改变了

嵌套结构体:

go中没有面向对象思想,也没有继承关系,但是可以通过结构体嵌套来实现这种效果

Dog结构体

type Dog struct{
    name string
    color string
    age int
}
Person结构体
type person struct{
    dog Dog
    name string
    age int
}

访问

package main

import (
    "fmt"
)

type Dog struct {
    name  string
    color string
    age   int
}

type person struct {
    dog  Dog
    name string
    age  int
}

func main() {
    var tom person
    tom.dog.name = "小花"
    tom.dog.age = 2
    tom.dog.color = "花色"

    tom.name = "tom"
    tom.age = 30

    fmt.Println(tom)
}

结果:

{{小花 花色 2} tom 30}