头图

1 结构体

相比于Java,在Go语言中没有类的概念,但是多了结构体。结构体与Java中的类很像,是表示一系列同一类型或不同类型的数据构成的数据集合。

例如可以将学生抽象成一个结构体,每一个学生有以下属性:

Name:姓名

Age:年龄

Gender:性别

Grade:年级

那么以上的所有属性就组成了一个结构体,这个结构体可以命名为Student。

2 结构体定义

在使用结构体时首先需要对结构体进行定义,定义结构体需要使用到关键字typestruct,语法如下:

type 结构体名称 struct {
  成员名 成员类型
}

Student结构体代码示例:

// 定义一个Student结构体
type Student struct {
  Name string
  Age int
  Gender string
  Grade string
}

如上所示,就定义了一个Student结构体,在这个结构体中有Name、Age等成员变量。

3 结构体声明

在声明结构体时可以直接指定结构体中成员变量的值。

代码示例:

package main

import "fmt"

func main() {
  // 1
  stu1 := Student{"张三", 18, "男", "大一"}
  // 2
  stu2 := Student{
    Name: "李四",
    Age: 20,
    Gender: "女",
    Grade: "大三",
  }
    // 3
  stu3 := Student{}
  fmt.Println(stu1)
  fmt.Println(stu2)
  fmt.Println(stu3)
}

// 定义结构体Student
type Student struct {
  Name string
  Age int
  Gender string
  Grade string
}
  1. 使用该方法声明结构体直接按照结构体中成员变量的顺序指定值即可,需要注意的是,这种方式给成员变量赋值需要全部赋值,不能只给其中部分赋值。
  2. 该方法使用键值对的形式给成员变量赋值,可以只给指定的成员变量赋值,其他没有赋值的则为默认值。
  3. 该方法只声明了一个结构体,没有给成员变量赋值,则结构体中所有变量均为默认值。

运行结果:

image.png

4 访问结构体成员

在上述的代码中,都是直接输出整个结构体,如果需要访问到结构体中的某一个成员变量,或者改变已经声明好的某个成员变量的值,就需要使用到.操作符。

代码示例:

package main

import "fmt"

func main() {
  // 声明结构体并赋值
  stu := Student{"张三", 18, "男", "大一"}
  // 打印结构体的值
  fmt.Println("学生姓名:", stu.Name)
  fmt.Println("学生年龄:", stu.Age)
  fmt.Println("学生性别:", stu.Gender)
  fmt.Println("学生年级:", stu.Grade)
  // 修改结构体中的值
  stu.Name = "李四"
  stu.Age = 19
  stu.Gender = "女"
  stu.Grade = "大二"
  // 打印修改后的结构体的值
  fmt.Println("-----------------")
  fmt.Println("学生姓名:", stu.Name)
  fmt.Println("学生年龄:", stu.Age)
  fmt.Println("学生性别:", stu.Gender)
  fmt.Println("学生年级:", stu.Grade)
}

// 定义结构体Student
type Student struct {
  Name string
  Age int
  Gender string
  Grade string
}

运行结果:

image.png

如上所示,使用.操作符可以很方便的访问或者修改结构体中的某一个成员变量。

5 方法

在之前的文章中学习过go语言中的函数,其实在go语言中既有函数又有方法,方法就是规定了接受者的函数,接受者就是在函数名称前面多了一个参数,表示将该方法绑定到这个参数对应的类型上,绑定之后该方法就只能被这个参数对应的类型的变量才能够调用。

如果有以下方法,该方法就只能Student类型的变量才能够调用,调用方式为变量名.方法名

func (stu Student) print()  {
  // 方法体
}

代码示例:

package main

import "fmt"

func main() {
  // 声明结构体并赋值
  stu := Student{"张三", 18, "男", "大一"}
  stu.print()
}

type Student struct {
  Name string
  Age int
  Gender string
  Grade string
}

func (stu Student) print()  {
  fmt.Println("姓名", stu.Name)
  fmt.Println("年龄", stu.Age)
  fmt.Println("性别", stu.Gender)
  fmt.Println("年级", stu.Grade)
}

在上述代码中定义了一个print方法,该方法的接受者为Student类型,则该方法与Student类型绑定,也就只能Student类型的变量才能够调用,所以在main中使用stu.print()调用该方法不会有问题,但是在main中无法直接调用该方法,并且使用stu调用该方法时,在方法内部可以拿到stu的成员变量的值。

运行结果:

image.png

6 结构体指针

结构体作为一种类型,同样有其对应的指针类型,例如上述例子中的结构体Student,就有其对应的指针类型*Student,可声明一个指针用于存储结构体变量的地址。

var stuPointer *Student

然后将结构体类型变量的地址通过取地址符&取出赋值给指针stuPointer

stuPointer = &stu

在使用结构体指针时,同样可以使用.操作符访问结构体内部的成员变量。

代码示例:

package main

import "fmt"

func main() {
  // 声明结构体并赋值
  stu := Student{"张三", 18, "男", "大一"}
  // 定义结构体指针
  var stuPointer *Student
  // 将结构体地址赋值给指针
  stuPointer = &stu
  // 结构体指针通过点(.)操作符访问成员变量
  fmt.Println("姓名:", stuPointer.Name)
  fmt.Println("年龄:", stuPointer.Age)
  fmt.Println("性别:", stuPointer.Gender)
  fmt.Println("年级:", stuPointer.Grade)
}

type Student struct {
  Name string
  Age int
  Gender string
  Grade string
}

运行结果:

image.png

同样可以使用结构体指针加.操作符修改成员变量。

本文参与了SegmentFault 思否写作挑战赛活动,欢迎正在阅读的你也加入。

CodeJR
12 声望0 粉丝