• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

go:struct(结构体)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

1. 简介

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

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

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

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

2. 初始化方式

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

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

    // 分配内存,并将属性初始化为所属类型的零值,返回一个指向该内存的指针
    person := new(Person)
    fmt.Printf("person:%v \n",person)    // person:&{0  0}
    person.id=1
    person.name="chen"
    person.age=24
    fmt.Printf("person:%v \n",person)    // person:&{1 chen 24}

    // 底层仍然调用 new(),值顺序严格按照字段顺序
    person2 := &Person{2,"wang",25}    // person:&{2 wang 25}
    fmt.Printf("person:%v \n",person2)

    // 此时也会分配内存,并将属性初始化为所属类型的零值
    var person3 Person
    fmt.Printf("person:%v \n",person3)    // person:{0  0}
    person3 = Person{3,"zhao",22}
    fmt.Printf("person:%v \n",person3)    // person:{3 zhao 22}

    person4 := Person{4,"sun",22}
    fmt.Printf("person:%v \n",person4)    // person:{4 sun 22}

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

    // 显示指明字段名称及其对应值
    var person5 = Person{ id:5,name:"pp5"}
    fmt.Printf("person:%v \n",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 \n", field1.Name, field1.Tag)
    field2 := str1.Field(1)
    // 输出:struct1 field2 name:name, tag:name of struct1
    fmt.Printf("struct1 field2 name:%v, tag:%v \n", 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}

 

  

 

  

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
RabbitMQ Go客户端教程2——任务队列/工作队列发布时间:2022-07-10
下一篇:
Tech-Ed 2006 is ready to go !发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap