Go语言 结构体struct的使用

golang中是没有class的,但是有一个结构体struct。结构体是用户定义的类型,是一种聚合的数据类型,由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员。

Go语言的struct,与C语言中的struct或C++语言中的类(class)类似。可以定义字段(属性)和方法。

结构体的声明

type Employee struct{

	firstName string
	lastName string
	age int

}

在上面的代码片段里,声明了一个结构体类型 Employee。它有三个字段,分别为firstName 、lastName 、age 。

在上面的结构体中,firstName 、lastName 是属于相同的类型的。所以可以把结构体重写为:

type Employee struct{

	firstName,lastName string
	age int

}

上面的Employee 结构体是一个命名结构体。可以用Employee 类型创建结构体变量。如下:

var dilbert Employee

dilbert结构体变量的成员可以通过点操作符访问,比如dilbert.firstName和dilbert.age 。

例子:

package main

import (  
    "fmt"
)

type Employee struct {  
    firstName, lastName string
    age  int
}

func main() {

    //使用字段名创建结构
    emp1 := Employee{
		firstName: "minger",
		age:       25,  
		lastName:  "minger-1",     
    }

    //在不使用字段名的情况下创建结构
    emp2 := Employee{"minger", "minger-2", 29}

    fmt.Println("Employee 1", emp1)
    fmt.Println("Employee 2", emp2)
}

输出结果:

在这里插入图片描述
创建了一个命名的结构体 Employee 。通过指定每个字段名的值,定义了结构体变量emp1 。字段名的顺序不一定要与声明结构体类型时的顺序相同。

定义了结构体变量emp2,省略了字段名。在这种情况下,就需要保证字段名的顺序与声明结构体时的顺序相同。

访问结构体的字段

通过变量名,使用点(.),可以访问结构体类型中的字段,或为字段赋值,也可以对字段进行取址(&)操作。

package main

import (  
    "fmt"
)

type Employee struct {  

    firstName, lastName string
    age int
}

func main() {  

    emp := Employee{"minger", "ming", 23}
    fmt.Println("First Name:", emp.firstName)
    fmt.Println("Last Name:", emp.lastName)
    fmt.Println("Age:", emp.age)

	fmt.Println("================")
	age := &emp.age
	*age = 20
	fmt.Println("Age:",emp.age)//20
}

编译输出:

在这里插入图片描述
结构体的指针

结构体与数组一样,都是值传递,比如当把数组或结构体作为实参传给函数的形参时,会复制一个副本。所以为了提高性能,一般不会把数组直接传递给函数,而是使用切片(引用类型)代替,而把结构体传给函数时,可以使用指针结构体。

指针结构体,即一个指向结构体的指针,声明结构体变量时,在结构体类型前加*号,便声明一个指向结构体的指针。

例子:

package main

import (  
    "fmt"
)

type Employee struct {  
    firstName, lastName string
    age int
}

func main() {  

    emp := &Employee{"minger", "chen", 23}
	fmt.Println("First Name:", (*emp).firstName)
	fmt.Println("Last Name:", (*emp).lastName)
	fmt.Println("Age:", (*emp).age)
		
}

编译输出:

在这里插入图片描述
注意:Go语言允许我们在访问 firstName字段时,可以使用emp.firstName 来代替显式的解引用 (*emp).firstName

匿名字段

创建结构体时,字段可以只有类型,而没有字段名,这样的字段字段称为匿名字段。

例子:

package main

import (  
    "fmt"
)
type Employee  struct {  
    string
    int
}

func main() {  
    emp := Employee{"Naveen", 50}
    fmt.Println(emp)
}

编译输出:
在这里插入图片描述在上面的程序中,结构体 Employee 有两个匿名字段。虽然匿名字段没有名称,但其实匿名字段名称就默认它的类型。

嵌套结构体

go语言当中的聚合和继承都是模拟出来的,子类是可以使用父类里的字段或功能,这样的结构体称为嵌套结构体

package main

import (  
    "fmt"
)

type Address struct {  //父类
    city, state string
}
type Person struct {  //子类
    name string
    age int
    address Address //模拟继承:结构体的嵌套
}

func main() {  
    var p Person
    p.name = "minger"
    p.age = 23
    p.address = Address {
        city: "shenzhen",
        state: "China",
    }
    fmt.Println("Name:", p.name)
    fmt.Println("Age:",p.age)
    fmt.Println("City:",p.address.city)
    fmt.Println("State:",p.address.state)
}

编译输出:

在这里插入图片描述
你的关注,是我写作路上最大的鼓励!

在这里插入图片描述
在这里插入图片描述
喜欢本文的朋友,欢迎关注微信公众号(图一) “程序猿编码” 收看更多精彩文章。扫码二维码(图二),添加本人微信。备注:加群。即可加入**“程序猿编码”交流群**。

发布了79 篇原创文章 · 获赞 53 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/chen1415886044/article/details/104250722