延迟处理、异常处理、结构体继承

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() //乐乐会动!
}
posted @ 2021-01-14 00:33  细雨骑驴入剑门  阅读(91)  评论(0编辑  收藏  举报