美文网首页
Go基础-006-04 复合数据类型 结构体

Go基础-006-04 复合数据类型 结构体

作者: 如逆水行舟不进则退 | 来源:发表于2020-02-23 18:00 被阅读0次

    1.类型

    结构体,用于描述一个整体结构的数据类型,在 Go 中,主要充当 OOP 的功能。
    类型标识符:

    struct {
      m1 m1T
      m2 m2T 
    }
    

    其中 struct 是结构体的关键字,m,就是 member 成员,也被称作 p,property 属性。
    一个结构体,由多个成员 member 构成,每个 member 都是用户自定义的,因此该结构体,也是用户自定义的数据类型。 该自定义,指的是结构上的自定义。(与数组切片,仅仅定义元素类型和长度是不同的)。

    一个结构体,体现的一个整体的数据的各个部分。例如:

    struct {
      name string
      age int 
    }
    

    表示一个用户,具备了 name 和 age 两个属性。同时也意味着,只要是一个用户,就一 定要具备该两个属性。

    在定义结构体时,往往会给结构体类型,起一个名字,称之为类型定义(别名),便于 之后方便的使用该结构体。类型的标识符(类型名)。
    典型的结构体定义类型如下:

    type Person struct {
       ID string
       Name string
       age int 
    }
    

    若没有起名字的结构体,称之为匿名结构体。 注意,以上语法,仅仅是定义了类型,而不是数据。仅仅是个结构。

    2.字面量

    语法: 类型标识符 {
    成员的初始化
    }
    成员的初始化语法,有如下几个方案:

    • StructType {},使用成员的零值进行初始化
    • StructType {mValue1, mValue2 .. mValueN},依据成员声明顺序,将全部成员进行初始化。
    • StructType {mN:mValueN},对特定成员变量进行初始化,其他成员变量使用类型 零值。

    代码示例:

    type Person struct {
       ID string
       Name string
       age int 
    }
    //fmt.Println(Person)
    
    fmt.Println(Person{})
    
    fmt.Println(Person{"42007", "Hank", 42}) 
    
    //fmt.Println(Person{"Hank", "42007",}) // too few values in Person literal
    fmt.Println(Person{ID: "42008"})
    
    

    3.结构体类型,类型名和类型数据概念区分

    结构体类型,是对类型的描述 。
    类型名,对该类型起的一个名字,便于访问。
    类型数据,基于该类型,创建的数据。
    类型 和 数据间的关系,相当于图纸和建筑物的关系。

    4.成员访问 .

    点运算符,用于完成对结构体数据成员的访问。
    语法: 结构体.成员变量 (范围限定符)

    代码示例:

    type Person struct {
       ID string
       Name string
       age int 
    }
    p1 := Person{"42007", "Hank", 42} 
    fmt.Println(p1.Name) // Hank
    
    

    5.匿名结构体

    没有为结构体类型起名字,直接去使用。
    匿名结构体的使用,通常需要立即使用其成员声明语法,得到数据。

    代码:

    //匿名结构体
    p := struct {
       ID string
       Name string
    }{ 
      "007",
      "Hank", 
    }
    
    fmt.Println(p, p.Name) // {007 Hank} Hank
    
    

    整体上的语法,就是匿名结构体的字面量语法。
    若需要相同的结构,则还需使用匿名结构体语法,可见匿名结构体仅仅适用于临时使用一次的结构。
    若结构体使用了多次,不建议使用匿名结构体,应该使用具名结构体(起名字的机构体)。

    6.结构体是值类型

    复制时,值会被拷贝!
    代码:

    p := struct {
       ID string
       Name string
    }{ 
      "007",
      "Hank", 
    }
    
    p2 := p
    p2.Name = "Firelinks" 
    fmt.Println(p, p2)
    // {007 Hank}  {007 Firelinks}
    
    

    相关文章

      网友评论

          本文标题:Go基础-006-04 复合数据类型 结构体

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