Go语言入门心法(一)
Go语言入门心法(二): 结构体
一: Go语言中结构体认知
go语言中的结构体认知升维:go语言中的结构体本身是一种自定义的数据类型,即然是数据类型,则可以用来声明其他的变量,被声明的变量即为结构体的实例对象go语言中的结构体融合了c语言中的结构体体征和面向对象的java|python中的类的特性go中结构体通常分为两种(1)普通结构体(2)匿名结构体go语言中结构体实例化: 通常我们要使用结构体中的成员变量与方法时,都需要先实例化结构体,再通过实例化对象来操作结构体重的成员属性和成员方法;go语言中实例化结构体有三种方法:(1) 标准实例化格式: var 机构体实例 结构体数量类型(2) new(结构体类型)函数实例化,实例化完成后会返回结构体的指针类型(3) 取地址实例化与new函数进行实例化类似,返回的是结构体指针类型,取地址实例化格式如下: 结构体实例 := &结构体类型{}
实例一: 普通结构体
package mainimport "fmt"/*
go语言中的结构体认知升维:go语言中的结构体本身是一种自定义的数据类型,即然是数据类型,则可以用来声明其他的变量,被声明的变量即为结构体的实例对象go语言中的结构体融合了c语言中的结构体体征和面向对象的java|python中的类的特性go中结构体通常分为两种(1)普通结构体(2)匿名结构体go语言中结构体实例化: 通常我们要使用结构体中的成员变量与方法时,都需要先实例化结构体,再通过实例化对象来操作结构体重的成员属性和成员方法;go语言中实例化结构体有三种方法:(1) 标准实例化格式: var 机构体实例 结构体数量类型(2) new(结构体类型)函数实例化,实例化完成后会返回结构体的指针类型(3) 取地址实例化与new函数进行实例化类似,返回的是结构体指针类型,取地址实例化格式如下: 结构体实例 := &结构体类型{}
*/
func main() {println(`go语言中的结构体与c语言中的结构体类似;go语言中的结构体相当于java|python中类功能相当`)type Book struct {title string // 标题author string // 作者numCount int // 数量id int64 // 编号id}println("go语言中的结构体定义中,如果变量类型相同的结构体成员,可以将它们写在同一行")type Person struct {name, address, schoolName string // 名称,地址,毕业学校age int // 年龄sex int // 性别: 0-男;1-女marry bool // 是否结婚}println()println("===================================第一种实例化结构体的方式===============================")// 创建类的实例标量 personvar person Person// 修改属性的默认值person.schoolName = "清华大学"println("实例化Person结构体: ", person.schoolName)println()fmt.Println(person)println()fmt.Println("结构体实例化第二种方式:")println("===================================第二种实例化结构体的方式===============================")book := new(Book)book.author = "老杨"book.title = "go语言零从入门到放弃"println(book)fmt.Println(book)println(book.title)println("====================================第三种实例化结构体的方式==============================")// 实例化动物结构体an := &Animal{"菲拉斯","猫科",20,}fmt.Println("Name : ", an.name, " , age : ", an.age, ", type: ", an.typeName)println("喵喵名称: ", an.name)// 调用结构体的方法an.ChangeName()println("调用结构体方法修改猫咪名称: ", an.name)
}// Animal 声明一个表示动物的结构体
type Animal struct {name stringtypeName stringage int
}// ChangeName 结构体的方法
func (an *Animal) ChangeName() {an.name = "小猫迷,芳芳"
}
运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_BookStructGrammar_go.exe D:\program_file\go_workspace\org.jd.data\struct\BookStructGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_BookStructGrammar_go.exego语言中的结构体与c语言中的结构体类似;
go语言中的结构体相当于java|python中类功能相当go语言中的结构体定义中,如果变量类型相同的结构体成员,可以将它们写在同一行
===================================第一种实例化结构体的方式===============================
实例化Person结构体: 清华大学
{ 清华大学 0 0 false}结构体实例化第二种方式:
===================================第二种实例化结构体的方式===============================
0xc000194060
&{go语言零从入门到放弃 老杨 0 0}
go语言零从入门到放弃
====================================第三种实例化结构体的方式==============================
Name : 菲拉斯 , age : 20 , type: 猫科Process finished with the exit code 0
二: 匿名结构体认知
go语言中匿名结构体认知:
go语言中通过内嵌套结构体的方式来实现继承;类似于其他语言中的类的继承和派生类的角色
子结构体中继承了父结构体中的结构体属性及结构体方法;结构体内嵌式一种组合特性,使用结构体内嵌是可构建一种面向对象编程思想中的继承关系;
匿名结构体定义与初始化:
匿名结构体,顾名思义,即结构体没有名称,与匿名函数类型。匿名结构体无须type关键字就可以直接使用
匿名结构体在创建的同时也要创建对象;匿名结构体的初始化更加简单,无须通过type关键字定义,且不用写出类型名称。
匿名结构体在初始化时需进行匿名结构体定义和成员变量初始化【可选】
实例二:匿名结构体
package mainimport ("encoding/json""fmt"
)/*
go语言中匿名结构体认知:go语言中通过内嵌套结构体的方式来实现继承;类似于其他语言中的类的继承和派生类的角色子结构体中继承了父结构体中的结构体属性及结构体方法;结构体内嵌式一种组合特性,使用结构体内嵌是可构建一种面向对象编程思想中的继承关系;匿名结构体定义与初始化:匿名结构体,顾名思义,即结构体没有名称,与匿名函数类型。匿名结构体无须type关键字就可以直接使用匿名结构体在创建的同时也要创建对象;匿名结构体的初始化更加简单,无须通过type关键字定义,且不用写出类型名称。匿名结构体在初始化时需进行匿名结构体定义和成员变量初始化【可选】*/// Book 定义书籍结构体
type Book struct {title stringauthor stringpublishNum intid string
}// Book结构体的方法
func (b *Book) setAuthor(authorName string) {b.author = authorName
}// BookBorrow 声明可供借阅的数据结构体
type BookBorrow struct {BookborrowTime string // 归还日期
}type BookNotBorrow struct {BookreadTime string // 借阅日期
}func main() {println("==========================go语言初始化第一种方式======================")bookBorrow := &BookBorrow{ // 使用类似map键值对信息实例化Book: Book{"线性代数","老张",2000,"987-2354-454-33-211",},borrowTime: "300",}fmt.Println(bookBorrow)fmt.Println("借阅的书籍:", bookBorrow.Book.title)println("==========================go语言初始化第二种方式======================")bookNotBorrow := new(BookNotBorrow)bookNotBorrow.title = "Java底层实现机制"bookNotBorrow.author = "老杨"bookNotBorrow.publishNum = 5000bookNotBorrow.readTime = "2023/10/13"bookNotBorrow.id = "987-2354-454-365-289"fmt.Println(bookNotBorrow)println("调用从父类继承的方法,修改作者名称:")println()bookNotBorrow.setAuthor("清华大学出版社")fmt.Println(bookNotBorrow)println("===========================go语言中匿名结构体=================================")// 定义匿名结构体并初始化化cat := struct {name stringage intcategory string}{name: "喵喵",age: 20,category: "猫科",}println("匿名结构体:")fmt.Println(cat)fmt.Println(cat.category)fmt.Println(cat.name)fmt.Println(cat.age)println(`匿名结构体的应用:匿名结构体一般可以组织全局变量,构建数据模版,解析JSON等`)// 使用匿名结构体定义全局变量var config struct {IP stringPort int}config.Port = 3306config.IP = "192.168.1.234"println("全局变量", config.IP)// 定义一个表示异常的结构体,来接收json的字符串窗data := &struct {Code intMessage string}{}jsonData := `{"code": 200,"message":"系统异常"}`if err := json.Unmarshal([]byte(jsonData), data); err != nil {println(err)}fmt.Println("Code: ", data.Code)fmt.Println("Message: ", data.Message)}
实例运行效果:
GOROOT=D:\program_file_worker\go1.20 #gosetup
GOPATH=D:\program_file_worker\go1.20\bin;C:\Users\Administrator\go #gosetup
D:\program_file_worker\go1.20\bin\go.exe build -o C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_AnonymityStructGrammar_go.exe D:\program_file\go_workspace\org.jd.data\struct\AnonymityStructGrammar.go #gosetup
C:\Users\Administrator\AppData\Local\Temp\GoLand\___go_build_AnonymityStructGrammar_go.exe
==========================go语言初始化第一种方式======================
&{{线性代数 老张 2000 987-2354-454-33-211} 300}
借阅的书籍: 线性代数
==========================go语言初始化第二种方式======================
&{{Java底层实现机制 老杨 5000 987-2354-454-365-289} 2023/10/13}
调用从父类继承的方法,修改作者名称:&{{Java底层实现机制 清华大学出版社 5000 987-2354-454-365-289} 2023/10/13}
===========================go语言中匿名结构体=================================
匿名结构体:
{喵喵 20 猫科}
猫科
喵喵
20匿名结构体的应用:
匿名结构体一般可以组织全局变量,构建数据模版,解析JSON等全局变量 192.168.1.234
Code: 200
Message: 系统异常Process finished with the exit code 0