第八章:结构体

本文深入浅出地介绍了Go语言中如何使用结构体定义复杂数据结构,包括声明、初始化、结构体方法(指针与值接收者)、内嵌结构与匿名结构的应用。实例演示了继承概念在图书管理中的运用,并展示了如何通过指针和值操作结构体的不同效果。
摘要由CSDN通过智能技术生成

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)
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值