Go语言结构体使用

409 阅读3分钟

结构体描述

结构体是由零个或多个任意类型的值构成的数据集合,属于复合类型,每个值可以称为结构体的成员字段

结构体字段有以下特性

  • 字段拥有自己的类型和值
  • 字段名必须唯一,不区分类型
  • 字段的类型也可以是结构体,甚至是字段所在结构体的类型

结构体格式

使用type和struct语句,格式如下

type 类型名 struct {
    字段1 字段1类型
    字段2 字段2类型
    …
}

各个部分使用说明:

  • 类型名,标志自定义结构体的名称,同一个包内唯一
  • struct{},结构体类型,type 类型名 struct{}可以理解为将struct{}结构体定义为类型名的类型
  • 字段一...表示结构体字段名,该结构体内唯一
  • 字段1类型...各个字段的类型

结构体用法

基本使用

定义一个person结构体,普通用法如下:

type person struct {
     name string
     age  int
     sex  int
}

也可以把相同的类型写在一行

type person struct {
     name      string
     age, sex  int
}

结构体实例化

只有当结构体实例化时,才会真正分配内存,必须实例化后才能使用结构体的字段

结构体也是一种类型,可以使用var关键字声明

var 结构体实例 结构体类型

使用案例

type Person struct {
	name         string
	city         string
        age          int
}

func main() {
   
   // 实例化1,全部给了默认值
    var p1 Person
    p1.name = "小明"
    p1.city = "北京"
    p1.age = 18
    fmt.Printf("p1=%v\n", p1)  //p1={小明 北京 18}
   
    // 实例化2 按照顺序初始化值,所有值必须赋值
    p := Person{"小明", "北京", 18}
    fmt.Println(p)
	
   // 实例化3  指定命名参数,无视顺序,没有赋值的为默认值
     p := Person{name: "小明"}
     fmt.Println(p)
   
   // 实例4 初始化为指针类型
    p := new(Person)
    fmt.Println(p) // &{  0}

} 

匿名结构体使用,一些临时数据可以使用

func main() {
  
  var user struct{Name string; Age int}
  user.Name = "pprof.cn"
  user.Age = 18
  fmt.Printf("%#v\n", user)

} 

类型别名和自定义类型

自定义类型使用

我们可以使用type关键字来自定义类型

自定义类型是一个全新的类型,可以基于内置的基本类型定义,也可以通过struct定义

 //将MyInt定义为int类型
 type MyInt int

全新类型MyInt具有基本类型int的特性

类型别名使用

类型别名规定:TypeAlias只是Type的别名,本质上TypeAlias与Type是同一个类型。就像一个孩子小时候有小名、乳名,上学后用学名,英语老师又会给他起英文名,但这些名字都指的是他本人。

 type TypeAlias = Type
 

我们之前见过的rune和byte就是类型别名,他们的定义如下:

 type byte = uint8
 type rune = int32

类型定义和类型别名的区别

//类型定义
type NewInt int

//类型别名
type MyInt = int

func main() {
    var a NewInt
    var b MyInt
    fmt.Printf("type of a:%T\n", a) //type of a:main.NewInt
    fmt.Printf("type of b:%T\n", b) //type of b:int
}

结果显示a的类型是main.NewInt,表示main包下定义的NewInt类型。b的类型是int。MyInt类型只会在代码中存在,编译完成时并不会有MyInt类型。