1. 结构体
Golang 也支持面向对象编程(OOP),但其并不是纯粹的面对对象,可以说是 Golang 支持面对对象编程。Golang 中没有类(class)的概念,Golang 中提供了结构体(struct)的概念用于实现 OOP 特性。
Golang 的面对对象编程十分简洁,去除了传统 OOP 的方法重载、构造函数、隐式的 this 指针等。Golang 具有封装、继承、多态的特性,实现方式与其他的 OOP语言不同,比如继承没有 extends 关键字,而是通过匿名类字段实现等。
1.1 定义结构体
语法格式:
type struct_variable struct {
Member definition
Member definition
...
Member definition
}
结构体的访问:
struct_variable.Member
.
操作符也被称为选择器(Selector)!
???? 定义结构体实例:
type Book struct {
ISBN int
Title string
Author string
}
查看其默认值:
var book Book
fmt.Println(book) // 输出: {0 }
1.2 创建结构体
1.2.1 基本的实例化形式
语法结构:
func main(){
var variable1 struct_variable
variable1.member = value
...
}
???? 结构体的赋值与输出:
func main(){
var book Book
book.ISBN = 123456
book.Title = "GolangStudy"
book.Author = "JOEL"
fmt.Println(book) // 输出: {123456 GolangStudy JOEL}
fmt.Println(book.Title)) // 输出: GolangStudy
}
1.2.2 简化的实例化形式
语法结构:
func main(){
// 1:
variable2 := struct_variable(value, ...)
// 2:
variable3 := struct_variable(key : value, ...)
}
???? 结构体的赋值与输出:
func main(){
book := Book{123456, "GolangStudy", "JOEL"}
fmt.Println(book) // 输出: {123456 GolangStudy JOEL}
}
func main(){
book := Book{ISBN:123456 ,Title : "GolangStudy", Author:"JOEL"}
fmt.Println(book) // 输出: {123456 GolangStudy JOEL}
}
func main(){
book := Book{Title:"GolangStudy"}
fmt.Println(book) // 输出: {0 GolangStudy }
}
1.2.3 new指针的实例化形式
语法结构:
func main(){
// 1:
var variable *struct_variable = new(struct_variable)
}
???? 结构体的赋值与输出:
func main(){
var book *Book = new(Book)
(*book).Title = "GolangStudy"
fmt.Println(book) // 输出: &{0 GolangStudy }
}
*
的作用是:根据地址取值!
book
为指针类型,保存的是对象的地址,所以赋值时,是给该地址所指向的对象的字段进行赋值,及(*book).title
的形式。其实可以简化为
,go编译器底层会自动转化为
(*book).title
1.2.4 返回指针的实例化形式
语法结构:
func main(){
var variable *struct_variable = &struct_variable{}
}
???? 结构体的赋值与输出一:
func main(){
var book *Book = &Book{}
(*book).ISBN = 123456
(*book).Title = "GolangStudy"
book.Author = "JOEL"
fmt.Println(book) // 输出: &{123456 GolangStudy JOEL}
}
???? 结构体的赋值与输出二:
func main(){
var book *Book = &Book{123456, "GolangStudy", "JOEL"}
fmt.Println(book) // 输出: &{123456 GolangStudy JOEL}
}
1.3 结构体之间的强换
1.3.1 结构体强换
结构体是用户单独定义的类型,与其他类型进行转换时需要具有完全相同的字段(名称、类型、个数)!
type Dog struct{
Name string
Age int
}
type Cat struct{
Name string
Age int
}
func main(){
var dog Dog = Dog{"汪汪", 2}
var cat Cat = Cat{"喵喵", 2}
dog = Dog(cat)
fmt.Println(dog) // 输出: {喵喵 2}
fmt.Println(cat) // 输出: {喵喵 2}
}
1.3.2 结构体重定义
结构体使用 type 关键字重新定义后(取别名),Golang 认为是新的类型,也可以相互强换
type Student struct{
Name string
}
type Stu Student
func main(){
var student Student = Student{"Jack"}
var stu Stu = Stu{"Tom"}
student = Student(stu)
fmt.Println(student) // 输出: {Tom}
fmt.Println(stu) // 输出: {Tom}
}
1.4 匿名字段和内嵌结构体
1.4.1 匿名字段
语法格式:
type struct_variable struct {
Member definition
Member definition
...
definition // 匿名字段
}
1.4.2 内嵌结构体
语法格式:
type struct_variable struct {
other_struct
Member definition
...
Member definition
}
???? 内嵌结构体实例:
type Person struct{
Name string
Age int
}
type Stu struct{
ID int
Person
}
func main(){
var stu Stu = Stu{ID:12345, Person:Person{"Jack", 2}}
fmt.Println(stu) // 输出: {12345 {Jack 2}}
fmt.Println(stu.ID) // 输出: 12345
fmt.Println(stu.Name) // 输出: Jack
fmt.Println(stu.Age) // 输出: 2
}
❤️ END ❤️