分类
golang

golang结构体

Go中的结构体

结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。就像Java中的类一样。

结构体的基本用法

结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体有中有一个或多个成员。type 语句设定了结构体的名称。结构体的格式如下:

package main

import (
    "fmt"
)

//定义结构体
type Person struct {
    //定义属性
    name string
    Age int
}

//定义结构体的方法,与普通方法相比,在func与方法名之间加入方法所属的结构体类型,表示方法是这个类型的一个方法
func (p Person) test()  {
    fmt.Println(p.name)
    fmt.Println(p.Age)
}


func main() {

    //创建结构体变量,注意不是new
    
    zhansan:=Person{name:"张三",Age:30}
    
    //访问结构体成员
    
    fmt.Println(zhansan.name)
    fmt.Println(zhansan.Age)
    
    //调用结构体方法
    zhansan.test()
    
    
    
}

需要注意的是,结构体是值类型,不像Java的类是引用类型,因此将结构体作为函数参数时,修改不会改变结构体本身,如果希望修改则需要传入结构体指针。

package main

import (
    "fmt"
)

//定义结构体
type Person struct {
    //定义属性
    name string
    Age int
}

//定义结构体的方法,与普通方法相比,在func与方法名之间加入方法所属的结构体类型,表示方法是这个类型的一个方法
func (p Person) test()  {
    fmt.Println(p.name)
    fmt.Println(p.Age)
}


func main() {

    //创建结构体变量,注意不是new

    zhansan:=Person{name:"张三",Age:30}

    //调用结构体方法
    zhansan.test()

    //调用方法修改结构体属性
    changeProperty(zhansan)

    //再次打印
    zhansan.test()

    //调用函数传入结构体指针
    changePropertyByPointer(&zhansan)
    
    zhansan.test()


}

func changeProperty(p Person)  {
    p.name="李四"
}

func changePropertyByPointer(p *Person)  {
    p.name="李四"
}



运行结果:

张三
30
张三
30
李四
30

结构体组合

go不支持继承,但可以通过组合实现,更加简便

type Person struct {
    Name string
}

func (p *Person) Introduce() {
    fmt.Printf("Hi, I'm %s\n", p.Name)
}

type Saiyan struct {
    //只写类型名,会自动将Person中的所有成员放入Saiyan中
    Person
    Power int
}

// 使用:
goku := &Saiyan{
    Person: &Person{"Goku"},
    Power: 9001,
}
goku.Introduce()

结构体Saiyan有一个字段时Persion类型。因此我们没有明确的给它一个字段名,我们可以间接的使用这个组合类型的字段和方法。然而,go编译器给会给该字段一个名字,认为这是完全有效的。

goku := &Saiyan{
    Person: &Person{"Goku"},
}

//两者使用方式是等效的
fmt.Println(goku.Name)
fmt.Println(goku.Person.Name)

上面代码都将打印Goku

由@不迷失

小白懂编程站长