Go自定义类型,类型别名,结构体

Go自定义类型、类型别名和结构体

自定义类型

type 自定义类型名 类型

示例

type myInt int
var n myInt
fmt.Printf("%T\n", n)

输出:main.myInt

说明

  1. 自定义类型在编译后仍然是我们定义的类型
  2. 自定义类型可以对基本类型进行拓展与改变

类型别名

type 类型别名=类型

示例

type myInt = int
var n myInt
fmt.Printf("%T\n", n)

输出:int

说明

  1. 类型别名并不改变变量的本质属性

  2. 类型别名在编译后会变回原变量类型

  3. 类型别名的意义在于给指定的类型赋于更直白的类型以便得代码更适合阅读与解析

结构体

定义格式

type 类型名 struct{
    字段名 字段类型
    字段名 字段类型
    ... 
}

//匿名结构体
var 变量名 struct{
    字段名 字段类型
    字段名 字段类型
    ...
}

//连续的同类型字段可以用字段类型简写
type 类型名 struct{
    字段1,字段2 字段类型
    ...
}

示例

type student struct{
    name string  //姓名字段
    id int       //学号字段
    gender byte  //性别字段
}

说明

  1. 结构体名在一个包内必须是唯一的

  2. 字段名在一个结构内是唯一的

  3. 结构体可以在函数内定义

使用

type person struct{
    name string
    id int
}

func main(){
    //先声明再初始化
    var a person
    a.name = "张三"
    a.id = 1
    fmt.Println(a)
    a.id = 2
    fmt.Println(a)
    fmt.Println(a.name)
    
    //声明变量同时初始化key-value模式
    var b = person{
        name: "小飞侠"
        id: 7
    }
    //声明变量同时用值列表进行初始化
    var c = person{
        "唐伯虎"
        9527
    }
}
//输出{张三 1}  {张三 2} 张三

用函数修改结构体字段的值

func f1(p person){
    p.name = "李四"
}
func f2(p *person){
    p.name = "李四" //  <=> (*p).name = "李四" 
}
func main(){
    var a person
    a.name = "张三"
    a.id =1
    fmt.Println(a) // {张三 1}
    f1(a)
    fmt.Println(a) // {张三 1}
    //无法改变,因为go中传入的永远是参数的复本
    f2(&a)
    fmt.Println(a)// {李四 1}
    
    //结构体指针
    var c = new(person) //c是一个person类型的指针
    c.name = "飞天小猪"
    c.id = 17
    f2(c)
    fmt.Println(*c)
}

内存

结构的各个字段内存是连续的

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容