Go语言不支持类,但是提供了结构体
通过使用结构体,可以自定义一系列由相同类型或不同类型的数据构成的数据集合,用来实现复杂的数据结构
定义结构体:
声明结构体:type 结构体名 struct{
成员变量1 类型
成员变量2 类型
…
}
实例化结构体:
标准初始化:var 结构体实例 结构体类型
new函数初始化:结构体实例 := new(结构体类型)
取地址初始化:结构体实例 := &结构体类型{}
type Book struct{
title string
anthor string
num int
id int
}
func main(){
var book Book
fmt.Printf("book:%+v",book)
newBook := new(Book)
fmt.Printf("newBook:%+v",newBook)
otherBook := &Book{}
fmt.Printf("otherBook:%+v",otherBook)
}
初始化结构体:
type Book struct{
title string
anthor string
num int
id int
}
func main(){
book := &Book{
title: "Go语言"
author: "Tom"
num:15
id:122
}
fmt.Printf("the title:%s",book.title)
}
结构体方法:——结构体的方法(分为指针类型和值类型接收者)
指针类型接收者:结构体方法的接收者为指针类型 即使实例不是指针类型,也可以修改结构体
值类型接收者:操作对应接收者的副本,及时使用了指针调用函数,也无法改变成员变量值
type User struct{
Name string
Email string
}
func (u *User) changeName(){
u.Name = "Tom"
}
func (u User) changeEmail(){
u.Email = "2@qq.com"
}
func main(){
user := User{"Peter","1@qq.com"} //创建非指针类型结构体实例,使用指针类型结构体方法改变实例
user.changeName()
fmt.Printf("user:%+v",user)
newUser := &User{"Alice","1@qq.com"} //创建指针类型结构体实例,使用值类型结构体方法也无法改变实例
newUser.changeEmail()
fmt.Printf("newUser:%+v",newUser)
}
结构体内嵌:
类似面向对象编程思想汇中的继承关系
比如说图书馆的书分为可借阅和不可借阅的书,两个共同继承了书的基本属性和方法。
type Book struct{
title string
anthor string
num int
id int
}
type BookBorrow struct{
Book
borrowTime string
}
type BookNoBorrow struct{
Book
readTime string
}
func main(){
bookBorrow := &BookBorrow{
Book:Book{"Go语言",
"Tom",
20,
15234,
},
borrowTime:"30"
}
bookNoBorrow := &BookNoBorrow{}
bookNoBorrow.title = "Python语言"
bookNoBorrow.author = "Peter"
bookNoBorrow.num = 10
bookNoBorrow.id = 12333
bookNoBorrow.readTime = "50"
fmt.Printf("bookBorrow:%+v",bookBorrow)
fmt.Printf("bookNoBorrow:%+v",bookNoBorrow)
}
匿名结构体
匿名结构体一般可用于组织全局变量,构建数据模板和解析JSON等
var config struct{ //组织全局变量
Ip string
Port int
}
func main(){
config.Ip = "192.168.0.1"
config.Prot = 80
data := &struct{
Code int
Msg string
}{}
jsonData := `{"code":200,"msg":""}`
if err := json.Unmarshall([]byte(jsonData),data);err != nil{
fmt.Println(err)
}
fmt.Println("code:",data.Code)
fmt.Println("msg:",data.Msg)
}