结构体
相比于 Java,在 Go 语言中没有类的概念,但是多了结构体。结构体与 Java 中的类很像,是表示一系列同一类型或不同类型的数据构成的数据集合。
例如可以将学生抽象成一个结构体,每一个学生有以下属性:
Name:姓名
Age:年龄
Gender:性别
Grade:年级
那么以上的所有属性就组成了一个结构体,这个结构体可以命名为 Student。
结构体定义
在使用结构体时首先需要对结构体进行定义,定义结构体需要使用到关键字type
和struct
,语法如下:
type 结构体名称 struct {
成员名 成员类型
}
复制代码
Student 结构体代码示例:
// 定义一个Student结构体
type Student struct {
Name string
Age int
Gender string
Grade string
}
复制代码
如上所示,就定义了一个 Student 结构体,在这个结构体中有 Name、Age 等成员变量。
结构体声明
在声明结构体时可以直接指定结构体中成员变量的值。
代码示例:
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
}
复制代码
使用该方法声明结构体直接按照结构体中成员变量的顺序指定值即可,需要注意的是,这种方式给成员变量赋值需要全部赋值,不能只给其中部分赋值。
该方法使用键值对的形式给成员变量赋值,可以只给指定的成员变量赋值,其他没有赋值的则为默认值。
该方法只声明了一个结构体,没有给成员变量赋值,则结构体中所有变量均为默认值。
运行结果:
访问结构体成员
在上述的代码中,都是直接输出整个结构体,如果需要访问到结构体中的某一个成员变量,或者改变已经声明好的某个成员变量的值,就需要使用到.
操作符。
代码示例:
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
}
复制代码
运行结果:
如上所示,使用.
操作符可以很方便的访问或者修改结构体中的某一个成员变量。
方法
在之前的文章中学习过 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 的成员变量的值。
运行结果:
结构体指针
结构体作为一种类型,同样有其对应的指针类型,例如上述例子中的结构体 Student,就有其对应的指针类型*Student
,可声明一个指针用于存储结构体变量的地址。
然后将结构体类型变量的地址通过取地址符&
取出赋值给指针stuPointer
。
在使用结构体指针时,同样可以使用.
操作符访问结构体内部的成员变量。
代码示例:
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
}
复制代码
运行结果:
同样可以使用结构体指针加.
操作符修改成员变量。
评论