zoukankan      html  css  js  c++  java
  • go:struct(结构体)

    1. 简介

      结构体类似于Java中的类,一般定义方式如下:

      结构体类型和字段的命名遵循可见性规则,即大写开头的外部可见;

      结构体的完全类型名称为:包名.结构体名称(中间有个点)

    type identifier struct {
        field1 type1
        field2 type2
        ...
    }

    2. 初始化方式

      new(Type) 和 &Type{} 是等价的

      初始化示例时,不显示指明字段类型时,必须按照 字段定义顺序赋值,且必须所有字段都要赋值;

        // 分配内存,并将属性初始化为所属类型的零值,返回一个指向该内存的指针
        person := new(Person)
        fmt.Printf("person:%v 
    ",person)    // person:&{0  0}
        person.id=1
        person.name="chen"
        person.age=24
        fmt.Printf("person:%v 
    ",person)    // person:&{1 chen 24}
    
        // 底层仍然调用 new(),值顺序严格按照字段顺序
        person2 := &Person{2,"wang",25}    // person:&{2 wang 25}
        fmt.Printf("person:%v 
    ",person2)
    
        // 此时也会分配内存,并将属性初始化为所属类型的零值
        var person3 Person
        fmt.Printf("person:%v 
    ",person3)    // person:{0  0}
        person3 = Person{3,"zhao",22}
        fmt.Printf("person:%v 
    ",person3)    // person:{3 zhao 22}
    
        person4 := Person{4,"sun",22}
        fmt.Printf("person:%v 
    ",person4)    // person:{4 sun 22}

      显示指明字段时,则不用按照字段顺序赋值,也可忽略某些字段

        // 显示指明字段名称及其对应值
        var person5 = Person{ id:5,name:"pp5"}
        fmt.Printf("person:%v 
    ",person5)    // person:{5 pp5 0} 

    3. 带标签的结构体

      定义结构体字段时,可以给字段添加标签,并通过 reflect 获取字段对应的标签(tag)

        type struct1 struct {
            id   int    "an id"
            name string "name of struct1"
        }
    
        st1 := struct1{12, "zhangsan"}
    
        str1 := reflect.TypeOf(st1)
        field1 := str1.Field(0)
        // 输出:struct1 field1 name:id, tag:an id
        fmt.Printf("struct1 field1 name:%v, tag:%v 
    ", field1.Name, field1.Tag)
        field2 := str1.Field(1)
        // 输出:struct1 field2 name:name, tag:name of struct1
        fmt.Printf("struct1 field2 name:%v, tag:%v 
    ", field2.Name, field2.Tag)

    4. 匿名字段

      匿名字段,即在定义结构体时,只定义字段的类型,不定义字段的名称;

      匿名字段的字段名默认为 字段类型的名称,所以一个结构体中同一类型的匿名字段最多只能存在一个不同类型的匿名字段可存在多个

        type struct1 struct {
            id   int
            string
        }
    
        st1:= struct1{1,"12"}
        // 输出:1 12
        fmt.Println(st1.id,st1.string)
        st1.string="123"
        // 输出:1 123
        fmt.Println(st1.id,st1.string)

    5. 内嵌结构体

        type a struct {
           id int
           name string
        }
    
        type b struct {
            a
            age int
            name string
        }
    
        b1:=b{a{1,"a"},12,"bb"}
        fmt.Println(b1) // {{1 a} 12 bb}
        // 内外层字段不同时,可直接通过字段名操作内层字段
        fmt.Println(b1.id) // 1
    // 字段名冲突时,外层字段优先级高于内层字段 b1.name = "bb2" fmt.Println(b1) // {{1 a} 12 bb2}
    // 操作冲突的内层字段时,可通过外层变量.内层变量,字段名 来操作 b1.a.name = "a2" fmt.Println(b1) // {{1 a2} 12 bb2}

      

      

  • 相关阅读:
    idea 中main 方法运行错误二
    shiro 忘记加密后的密码怎么办?
    idea 中 Caused by: java.lang.ClassNotFoundException: org.springframework.web.util.IntrospectorCleanupListener
    Date 类型的比较
    oracle中数据类型对应java类型[转载]
    mybitis面试题基础必考 Mybatis 中$与#的区别
    301
    201
    0
    Apache负载 均衡
  • 原文地址:https://www.cnblogs.com/virgosnail/p/12957080.html
Copyright © 2011-2022 走看看