GoLang补充提升(三)

GoLang补充提升(三)

1.panic和recover

  • 注意:defer recover要定义在可能出错的地方之前
func main() {
	f1()
	f2()
	f3()
}

func f1() {
	fmt.Println("F1")
}

func f2() {
	defer func() {
		err := recover()
		fmt.Println(err)
		fmt.Println("错误恢复")
	}()
	panic("发生严重错误!")
	fmt.Println("F2")
}

func f3() {
	fmt.Println("F3")
}

2.fmt标准库介绍

fmt标准库介绍 传送门

3.自定义类型和类型别名

type myInt int     //自定义类型
type yourInt = int //类型别名

func main() {
	var i1 myInt
	i1 = 3
	fmt.Printf("%T\n", i1)
	var i2 yourInt
	i2 = 6
	fmt.Printf("%T\n", i2)

	var c rune
	c = '周'
	fmt.Printf("%T\n", c)
	fmt.Println(c)
}

4.结构体的值接收者和指针接收者

  • 指针类型的接收者由一个结构体的指针组成,由于指针的特性,调用方法时修改接收者指针的任意成员变量,在方法结束后,修改都是有效的。
  • 当方法作用于值类型接收者时,Go语言会在代码运行时将接收者的值复制一份。在值类型接收者的方法中可以获取接收者的成员值,但修改操作只是针对副本,无法修改接收者变量本身。

什么时候使用值接收者什么时候使用指针接收者?

  • 需要修改接收者中的值
  • 接收者是拷贝代价比较大的大对象
  • 保证一致性,如果有某个方法使用了指针接收者,那么其他的方法也应该使用指针接收者。
type person struct {
	name string
	age  int
	sex  bool
}

func (p *person) Func1(newName string) {
	p.name = newName
}

func (p person) Func2(newAge int) {
	p.age = newAge
}

func main() {
	p := person{
		name: "zzs",
		age:  18,
		sex:  false,
	}
	p.Func1("ywj") //(指针接收者)会修改
	fmt.Println(p)
	p.Func2(999) //(值接收者)不会修改
	fmt.Println(p)
}

5.任意类型添加方法

type myInt int

func (i myInt) print() {
	fmt.Println(i)
}

func main() {
	var myInt myInt = 10
	myInt.print()
}

6.匿名结构体实现继承关系

type animal struct {
	name string
}

func (a *animal) move() {
	fmt.Println(a.name, ":移动")
}

type dog struct {
	animal
}

func (d *dog) study() {
	fmt.Println("dog学习")
}

type cat struct {
	animal
}

func (c *cat) sleep() {
	fmt.Println("cat睡觉")
}
func (c *cat) move() {
	fmt.Println("cat重写移动")
}

func main() {
	d := &dog{
		animal{name: "zzs"},
	}
	c := &cat{
		animal{name: "ywj"},
	}
	d.study()
	c.sleep()
	d.move()
	c.move()
}

7.结构体与json

//使用json序列化结构体,字段的名称需要大写,否则访问不到
type person struct {
	Name string `json:"name"`
	Age  int    `json:"age"`
	Sex  bool   `json:"sex"`
}

func main() {
	p := person{
		Name: "zzs",
		Age:  18,
		Sex:  false,
	}
	buffer, err := json.Marshal(p)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(string(buffer))
	fmt.Println("=========================")

	//{"name":"zzs","age":18,"sex":false}
	jsonStr := "{\"name\":\"zzs\",\"age\":18,\"sex\":false}"

	var pp person
	json.Unmarshal([]byte(jsonStr), &pp)
	fmt.Println(pp)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值