• 【Go ~ 0到1 】 第四天 6月30 defer,结构体,方法


    1. defer 延迟调用
      将defer 后面的语句延迟执行 , 会把执行当改行代码时的状态保存下来(变量后续值的变化不会影响) 多用于资源的释放 类似Java中的 finally

    func defermethod() {
    fmt.Println(“最先执行”)
    defer fmt.Println(“最后执行”)
    fmt.Println(“第二执行”)
    defer fmt.Println(“倒数第二执行执行”)
    }
    输出结果 为 : 最先执行 -> 第二执行 -> 倒数第二执行执行 -> 最先执行

    注意事项 :

    1. 函数中有多个defer时,将采用 先进后出 (先声明的后执行,队列)

    2. defer会保留运行到这一行代码时的状态 虽然会延迟执行
      i := 10
      defer fmt.Println(i)
      i = 20
      例如上述代码 最终控制台的打印结果仍然为 10

    3. 结构体

    2.1 什么是结构体
    结构体解释为 将一个或多个变量组合到一起, 形成一个新的类型,这个类型就是结构体

    Java中的类本质就是Go语言的结构体 但是 Go语言中的结构体是引用类型 而 Java中的类 是引用数据类型

    2.2 结构体的声明与赋值

    type 结构体名 struct{
    字段一 字段一的类型
    字段二 字段二的类型
    }

    //先声明结构体
    type Person struct {
    	name string
    	age  int
    }
    
    // 再赋值
    var no1 Person
    no1.name = "张三"
    no1.age = 19
    
    fmt.Println(no1)
    
    
    //声明结构体的同时赋值
    type Person struct {
    	name string
    	age  int
    }
    
    p1 := Person{
    	name: "张三",
    	age:  19,
    }
    
    fmt.Println(p1)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    注意 : 没有赋值的结构体字段会使用默认值

    2.3 结构体指针
    结构体是值类型,赋值的时候都是拷贝
    当结构体字段较多的时候,为了减少内存可以传递结构体指针

    2.4 构造函数
    type studnet struct {
    name string
    age int
    }

    func structmethod(name string, age int) studnet {

    return studnet{
    	name: name,
    	age:  age,
    }
    
    • 1
    • 2
    • 3
    • 4

    }

    1. 结构体与JSON的转换

    3.1 序列化

    // 结构体
    type teach struct {
    Name string json:"name,omitempty"
    Age int json:"age,omitempty"
    }

    func serialmethod() {

    //创建对象并赋值
    t1 := teach{
    	Name: "张三老师",
    	Age:  23,
    }
    
    //序列化
    marshal, err := json.Marshal(t1)
    
    if err != nil {
    	panic(err)
    }
    
    fmt.Println(string(marshal))
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    }

    3.2 反序列化
    func unserialmethod() {

    str := "{\"name\":\"张四老师\",\"age\":24}"
    
    //创建对象
    var t2 teach
    
    //反序列化  注意  需要传t2对象的引用地址  否则不能改变 t2 的值
    err := json.Unmarshal([]byte(str), &t2)
    
    if err != nil {
    	panic(err)
    }
    
    fmt.Println(t2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    }

    4.方法

    4.1 方法的定义

    在Go语言中,函数和方法不太一样,有明确的概念区分。其他语言中,比如Java,一般来说函数就是方法,方法就是函数,但是在Go语言中,函数是指不属于任何结构体、类型的方法,也就是说函数是没有接收者的;而方法是有接收者的,我们说的方法要么是属于一个结构体的,要么属于一个新定义的类型的。

    方法的声明和函数类似,他们的区别是:方法在定义的时候,会在func和方法名之间增加一个参数,这个参数就是接收者,这样我们定义的这个方法就和接收者绑定在了一起,称之为这个接收者的方法。

    方法接受者通常使用类型的小写
    // 结构体
    type China struct {
    City string json:"city,omitempty"
    Popu int json:"popu,omitempty"
    }

    // 序列化方法
    func (c China) seriMethod() []byte {

    //将结构体序列化
    marshal, err := json.Marshal(c)
    
    if err != nil {
    	panic(err)
    }
    
    return marshal
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    }

    // 反序列化方法
    func unseriMethod(bts []byte) China {

    var cnew China
    
    json.Unmarshal(bts, &cnew)
    
    return cnew
    
    • 1
    • 2
    • 3
    • 4
    • 5

    }

  • 相关阅读:
    Elasticsearch 8.9 Master节点处理请求源码
    要想后期修改少,代码重构要趁早
    axios从入门到源码分析之axios的理解和使用(一)
    在unity中利用公开变量引用物体和组件(有手就会)
    【java】IO流
    想在抖音开店粉丝不够怎么办?不足1000粉丝的,来看怎么操作
    Java网络教程之Socket
    【HTML】笔记2-表格、列表、表单标签
    Linux设备树(Device Tree)何时被解析
    「基础知识」带你深度剖析路由器和交换机!
  • 原文地址:https://blog.csdn.net/JAVAlife2021/article/details/125546302