美文网首页Go Lang 实战
Go数据-结构体(五)

Go数据-结构体(五)

作者: 草莓君_ | 来源:发表于2019-08-02 15:49 被阅读0次

结构体

结构体(struct)将多个不同类型命名字段(field)序列打包成一个复合类型。

  • 字段名必须唯一
  • 可用“_”补位
  • 支持使用自身指针类型成员
  • 字段名、排列顺序属于类型组成部分。
type node struct {
    _    int
    id   int
    next *node
}

func main() {
    n1 := node{
        id: 1,
    }
    n2 := node{
        id:   2,
        next: &n1,
    }
    fmt.Println(n1, n2)
}

可按顺序初始化全部字段,或使用命名方式初始化指定字段

func main() {
    type user struct {
        name string
        age int
    }

    u1 := user{"Tom", 12}
    u2 := user{"tome"} //编译报错too few values in user literal
}

可直接定义匿名结构类型变量,或用作字段类型。但因其缺少类型标识,在作为字段类型时无法直接初始化。

func main() {
    u := struct {
        name string
        age int
    }{
        name: "Tom",
        age: 19,
    }

    type file struct {
        name string
        attr struct{
            owner int
            perm int
        }
    }

    f := file{
        name: "test.dat",
        //attr: {           //错误missing type in composite literal
        //  owner: 1,
        //  perm: 0121,
        //},
    }

    f.attr.owner = 1 //正确方式
    f.attr.perm = 2

    fmt.Println(u, f)
}

只有在所有字段类型全部支持时,才可能做相等操作。

func main() {
    type data struct {
        x int
        y map[string]int
    }

    d1 := data{
        x: 1,
    }

    d2 := data{
        x: 1,
    }

    println(d1 == d2) //无效操作struct containing map[string]int cannot be compared
}

可使用指针直接操作结构字段,但不能时多级指针。

func main() {
    type user struct {
        name string
        age  int
    }

    p := &user{
        name: "Tom",
        age:  19,
    }
    
    p.name = "Mary"
    p.age++
}

空结构

空结构(struct{})是指没有字段的结构类型。他比较特殊,因为无论是其自身,还是作为数组元素类型,其长度都为零。

func main() {
    var a struct{}
    var b [100]struct{}
    println(unsafe.Sizeof(a),unsafe.Sizeof(b))
}

输出: 0 0
尽管没有分配数组内存,但依然可以操作元素,对应切片len、cap属性也正常。

func main() {
    var d [100]struct{}
    s := d[:]

    d[1] = struct{}{}
    d[2] = struct{}{}

    fmt.Println(s[3], len(s), cap(s))
}

输出:

{} 100 100

匿名字段

所谓匿名字段,是指没有名字,仅有类型的字段,也被称作嵌入字段或嵌入类型。

type attr struct {
    perm int
}
type file struct {
    name string
    attr        //仅有类型名
}

不能将基础类型和其指针类型同时嵌入,因为两者隐式名字相同。

type data struct {
    *int
    int   //错误 duplicate field int
}

虽然可以像普通字段那样访问匿名字段成员,但会存在重名问题。默认情况下,编译器从当前显式命名字段开始,逐步向内查找匿名字段成员。如匿名字段成员被外层同名字段遮蔽,那么必须使用显式字段名。

func main() {
    d := data{
        name: "data",
        file: file{"file"},
    }
    d.name = "data2"        //当问data.name
    d.file.name = "file2"   //使用显式字段名访问 data.file.name

    fmt.Println(d.name, d.file.name)
}

相关文章

  • Go数据-结构体(五)

    结构体 结构体(struct)将多个不同类型命名字段(field)序列打包成一个复合类型。 字段名必须唯一 可用“...

  • Golang(十) 结构体

    结构体 什么是结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。 结...

  • Go教程第十一篇:结构体

    结构体 本文我们着重讲解一下Go语言中的结构体。 什么是结构体 ? 结构体是用户定义的数据类型,它表示了一组字段的...

  • Go-开发辅助工具

    Golang开发工具 JSON-to-Go JSON-to-Go 是一个将 json 数据转换为 Go 结构体的在...

  • go 结构体与方法

    go 结构体相当于 python 中类的概念,结构体用来定义复杂的数据结构,存储很多相同的字段属性 结构体的定义 ...

  • Go语言之结构体嵌套

    Go语言之结构体嵌套 在type Student2 struct结构体中,注意book参数引用的是地址,方便修改数据

  • 《Go语言四十二章经》第十八章 Struct 结构体

    《Go语言四十二章经》第十八章 Struct 结构体 作者:李骁 18.1结构体(struct) Go 通过结构体...

  • 结构体

    结构体初识 结构体指针 结构体的匿名字段 结构体嵌套 Go语言中的OOP

  • go结构体(struct)和方法(method)

    结构体(struct) go中没有对象这一概念,所以采用了结构体的概念,结构体在go中有着非常重要的位置。结构体是...

  • Go-Struct

    自定义类型 类型别名 go 结构体 Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构...

网友评论

    本文标题:Go数据-结构体(五)

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