延迟处理、异常处理、结构体继承
1.defer、panic、recover
2.make和new
func main() {
var userinfo map[string]string
userinfo["username"] = "张三"
fmt.Println(userinfo)
}
func main() {
var a *int
*a = 100
fmt.Println(*a)
}
报错。此处因为map是引用数据类型。所以必须先分配空间才能用。
前面使用map:
func main() {
scoreMap := make(map[string]int, 8)
scoreMap["张三"] = 90
scoreMap["小明"] = 100
fmt.Println(scoreMap)
fmt.Println(scoreMap["小明"])
fmt.Printf("type of a:%T\n", scoreMap)
}
此处包括切片也是这样。
3.结构体
3.1 大小写=》公私有
结构体首字母可以大写也可以小写,大写表示这个结构体是公有的,在其他的包里面
可以使用。小写表示这个结构体是私有的,只有这个包里面才能使用。
3.2 详细打印结构体
package main
import "fmt"
type person struct {
name string
city string
age int
}
func main() {
var p1 person
p1.name = "张三"
p1.city = "北京"
p1.age = 18
fmt.Printf("p1=%v\n", p1) //p1={张三 北京 18}
fmt.Printf("p1=%#v\n", p1) //p1=main.person{name:"张三", city:"北京", age:18}
}
打印结构体的时候,用%#v,可以打印详细信息。
3.3 初始化方法
3.4 结构体是值类型
3.5 结构体方法
格式定义
func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
函数体
}
其中
• 接收者变量: :接收者中的参数变量名在命名时,官方建议使用接收者类型名的第一个小写字母,而不是 self、this 之类的命名。例如,Person 类型的接收者变量应该命名为 p,Connector 类型的接收者变量应该命名为 c 等。
• 接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型。
• 方法名、参数列表、返回参数:具体格式与函数定义相同。
• 需要修改内部属性的时候,接收者类型应为指针类型
4.给自定义类型添加方法
注意只能给本地数据类型添加方法。
5.嵌套匿名结构体
package main
import "fmt"
//Address 地址结构体
type Address struct {
Province string
City string
}
//User 用户结构体
type User struct {
Name string
Gender string
Address //匿名结构体
}
func main() {
var user2 User
user2.Name = "张三"
user2.Gender = "男"
user2.Address.Province = "广东" //通过匿名结构体.字段名访问
user2.City = "深圳" //直接访问匿名结构体的字段名
fmt.Printf("user2=%#v\n", user2) //user2=main.User{Name:" 张 三 ", Gender:" 男 ",
Address:main.Address{Province:"广东", City:"深圳"}}
}
注意:当访问结构体成员时会先在结构体中查找该字段,找不到再去匿名结构体中查找。
6.继承(通过嵌套结构体实现)
package main
import "fmt"
//Animal 动物
type Animal struct {
name string
}
func (a *Animal) run() {
fmt.Printf("%s 会运动!\n", a.name)
}
//Dog 狗
type Dog struct {
Age int8
*Animal //通过嵌套匿名结构体实现继承
}
func (d *Dog) wang() {
fmt.Printf("%s 会汪汪汪~\n", d.name)
}
func main() {
d1 := &Dog{
Age: 4,
Animal: &Animal{ //注意嵌套的是结构体指针
name: "阿奇",
},
}
d1.wang() //乐乐会汪汪汪~
d1.run() //乐乐会动!
}