浅谈Go的结构体

110 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

Go语言中没有像Java面向对象那种“类”的概念,但是可以通过结构体中的内嵌结构体和接口搭配就会比面向对象更加灵活多变

类型别名和自定义类型

自定义类型

使用type关键字来定义自定义类型,Myfloat 是一种新的类型,就具有float的特性

 //将Myfloat定义为float32类型
    type Myfloat float32 

类型别名

这是go1.19版本新添加的功能 这里的newType就是Type的别名,实际上就是换个叫法,类似别人起的外号、英文名等

    type newType = Type 
    //之前见过的rune byte就是类型别名
    type byte = uint8
    type rune = int32

两者的区别

//类型定义
type Newfloat float32

//类型别名
type Myfloat = float32

func main() {
    var a Newfloat
    var b Myfloat

    fmt.Printf("type of a:%T\n", a) //type of a:main.Newfloat
    fmt.Printf("type of b:%T\n", b) //type of b:float32
} 

结果显示a的类型是main.Newfloat,表示main包下定义的Newfloat类型。b的类型是float32。Myfloat类型只会在代码中存在,编译完成时就不存在Myfloat类型了

结构体

结构体定义

使用type和struct关键字来定义结构体,具体代码格式如下:

 type 类型名 struct {
        字段名 字段类型
        字段名 字段类型
        …
    } 
  • 类型名:标识自定义结构体的名称,在同一个包内不能重复
  • 字段名:表示结构体字段名,结构体中的字段名必须唯一
  • 字段类型:表示结构体字段的具体类型

结构体实例化

只有当结构体实例化时,才会真正地分配内存,结构体本身也是一种类型,我们可以像声明内置类型一样使用var关键字声明结构体类型。

var 结构体实例 结构体类型

type person struct {
    name string
    city string
    age  int8
}

func main() {
    var p1 person
    p1.name = "name"
    p1.city = "city"
    p1.age = 18
    fmt.Printf("p1=%v\n", p1) //p1={name city 18}
    fmt.Printf("p1=%#v\n", p1) //p1=main.person{name:"name", city:"city", age:18}
} 
  • %v 按默认格式输出
  • %+v 在%v的基础上额外输出字段名
  • %#v 在%+v的基础上额外输出类型名

面试题

type student struct {
    name string
    age  int
}

func main() {
    m := make(map[string]*student)
    stus := []student{
        {name: "a", age: 18},
        {name: "b", age: 23},
        {name: "c", age: 28},
    }

    for _, stu := range stus {
        m[stu.name] = &stu
    }
    for k, v := range m {
        fmt.Println(k, "=>", v.name)
    }
} 

考察range的使用方法,stu拷贝的是副本

总结

今天主要学习了Go类型别名与结构体,对于刚入门go语言的我来说,还有许多地方需要学习,有错误的地方欢迎大家指出,共同进步!!