美文网首页
go结构体注意事项和使用细节

go结构体注意事项和使用细节

作者: StevenQin | 来源:发表于2019-04-11 17:11 被阅读0次

    1、结构体的所有字段在内存中是连续的。
    案例一

    //定义结构体
    type Point struct {
        x int
        y int
    }
    
    //矩形节构体
    type Rect struct {
        leftUp, rightDown Point
    }
    
    func main() {
        r1 := Rect{Point{1, 2}, Point{3, 4}}
        fmt.Printf("r1.leftUp.x=%p\nr1.leftUp.y=%p\nr1.rightDown.x=%p\nr1.rightDown.y=%p\n",
            &r1.leftUp.x, &r1.leftUp.y, &r1.rightDown.x, &r1.rightDown.y)
    }
    

    r2有两个 Point类型,这两个Point类型的本身地址是连续的,但它们指向的地址不一定是连续的

    //定义结构体
    type Point struct {
        x int
        y int
    }
    
    //矩形节构体
    type Rect struct {
        leftUp, rightDown Point
    }
    
    type Rect2 struct {
        leftUp, rightDown *Point
    }
    
    func main() {
        r1 := Rect{Point{1, 2}, Point{3, 4}}
        fmt.Printf("r1.leftUp.x=%p\nr1.leftUp.y=%p\nr1.rightDown.x=%p\nr1.rightDown.y=%p\n",
            &r1.leftUp.x, &r1.leftUp.y, &r1.rightDown.x, &r1.rightDown.y)
    
        r2 := Rect2{&Point{10, 20}, &Point{30, 40}}
        fmt.Println()
    
        fmt.Printf("r2.leftUp本身地址%p\nr2.rightDown本身地址%p\n", &r2.leftUp, &r2.rightDown)
        fmt.Println(r2)
    }
    

    2、两个结构体类型转换的时候,两个必须有完全相同的字段名称、个数和类型

    //定义结构体
    type A struct {
        Num int
    }
    
    type B struct {
        Num int
    }
    
    func main() {
        var a A
        var b B
        a = A(b)
    
        fmt.Println(a, b)
    }
    

    3、结构体进行type重新定义(相当于取别名),Golang认为是新的数据类型。但是相互间可以强转

    //定义结构体
    type Student struct {
        Name string
        Age  int
    }
    
    type Stu Student
    
    func main() {
        //Student 和Stu是两个不同的数据类型
        var stu1 Student
        var stu2 Stu
        //数据类型转换
        stu2 = Stu(stu1)
        fmt.Println(stu1, stu2)
    
        type interger int //给int取别名为interger
    
        var i interger = 10
        var j int = 20
        //数据类型转换
        j = int(i)
        fmt.Println(i, j)
    }
    

    4、struct的每个字段上,可以写上一个tag,该tag可以通过反射机制获取
    ,常见的使用场景是序列化和反序列化。

    image.png
    package main
    
    import (
        "encoding/json"
        "fmt"
        _ "sort"
    )
    
    //定义结构体
    type Monster struct {
        Name  string `json:"name"` // `json:"name"` 这个部分就是结构体的tag
        Age   int    `json:"age"`
        Skill string `json:"skill"`
    }
    
    func main() {
        //1、创建一个Monster变量
        monster := Monster{"牛魔王", 500, "牛头拳"}
        //2、将monster变量序列化为 json格式的字符串
        //json.Marshal()底层用到了反射
        jsonStr, err := json.Marshal(monster)
        if err != nil {
            fmt.Println("json处理错误", err)
        }
        fmt.Println("jsonStr = ", string(jsonStr))
    }
    
    

    相关文章

      网友评论

          本文标题:go结构体注意事项和使用细节

          本文链接:https://www.haomeiwen.com/subject/kalxwqtx.html