Image Description

Go中的结构体属于数据类型的一种,先回顾下 Go语言的类型,其包含如下基本内容:

1.基础类型:byte、int、bool、float等

2.复合类型:数组、结构体、指针等

3.可以指向任意对象的类型:Any类型

4.值语义和引用语义

5.面向对象,既所有具备面向对象特征的类型:如成员方法

6.接口

Go 语言中的大多数类型都是值语义,并且都可以包含对应的操作方法,我们可以给任何类型增加“新方法”。

而在实现某个接口时,无需从该接口继承,只需要实现该接口要求的所有方法即可。任何类型都可以被 Any类型引用,Any类型就是空接口。

结构体 struct和数组一样,属于复合类型。Go 语言中的数组是用来存储同一类型的数据,而结构体是一系列具有相同或不同类型的数据集合。结构体表示一项记录。

例如一个学生的身份信息,可以定义为结构体集合:

Name: 姓名

Gender: 性别

Age: 年龄

ID: 学号

Class: 班级

定义结构体

用 type和 struct关键字来定义一个结构体:type 定义结构体的名称,struct语句定义一个新的数据类型

type Student struct {
    name   string
    gender string
    age    byte
    id     int
    class  string
}

定义了结构体之后,就可以用于变量的声明:

XiaoMing := Student { "小明", "男", 8, "20120102", "三年级二班" }

访问结构体

通过点符号来访问结构体中的成员

代码示例

package main 

import "fmt"

type Student struct {
    name   string
    gender string
    age    int
    id     int
    class  string
}

func main() {

    var XiaoMing Student
    XiaoMing.name     =  "小明"
    XiaoMing.gender   =  "男"
    XiaoMing.age      =  8
    XiaoMing.id       =  20120201
    XiaoMing.class    =  "三年级二班"

    fmt.Printf("XiaoMing name is : %s\n", XiaoMing.name)
    fmt.Printf("XiaoMing gender is : %s\n", XiaoMing.gender)
    fmt.Printf("XiaoMing age is : %s\n", XiaoMing.age)
    fmt.Printf("XiaoMing id is : %d\n", XiaoMing.id)
    fmt.Printf("XiaoMing class is : %s\n", XiaoMing.class)
}

结构体作为函数参数

package main 

import "fmt"

type Student struct {
    name   string
    gender string
    age    int
    id     int
    class  string
}

func main() {

    var XiaoMing Student
    XiaoMing.name     =  "小明"
    XiaoMing.gender   =  "男"
    XiaoMing.age      =  8
    XiaoMing.id       =  20120201
    XiaoMing.class    =  "三年级二班"

    /* 将结构体作为参数传递给函数 */
    prientStudent(XiaoMing)
}

func prientStudent(student Student) { //变量名 类型(参数)
  fmt.Printf("XiaoMing name is : %s\n", XiaoMing.name)
  fmt.Printf("XiaoMing gender is : %s\n", XiaoMing.gender)
  fmt.Printf("XiaoMing age is : %s\n", XiaoMing.age)
  fmt.Printf("XiaoMing id is : %s\n", XiaoMing.id)
  fmt.Printf("XiaoMing class is : %s\n", XiaoMing.class)
}

结构体指针

定义指向结构体的指针

//struct_pointer 结构体指针变量
var struct_pointer *Student

指针变量 struct_pointer 用来存储结构体变量的地址

//把小明的地址值赋值给指针变量
var struct_pointer &XiaoMing

现在能通过结构体指针就能访问结构体成员

struct_pointer.name

代码示例

package main 

import "fmt"

type Student struct {
    name   string
    gender string
    age    int
    id     int
    class  string
}

func main() {

    var XiaoMing Student
    XiaoMing.name     =  "小明"
    XiaoMing.gender   =  "男"
    XiaoMing.age      =  8
    XiaoMing.id       =  20120201
    XiaoMing.class    =  "三年级二班"
    
    /* 传递的是指针变量保存的结构体地址 */
    prientStudent(&XiaoMing) 
}

func prientStudent(student *Student) {  //*用来取&指向的地址里的值
  fmt.Printf("XiaoMing name is : %s\n", XiaoMing.name)
  fmt.Printf("XiaoMing gender is : %s\n", XiaoMing.gender)
  fmt.Printf("XiaoMing age is : %s\n", XiaoMing.age)
  fmt.Printf("XiaoMing id is : %s\n", XiaoMing.id)
  fmt.Printf("XiaoMing class is : %s\n", XiaoMing.class)
}