Go语言基础之结构体

张开发
2026/4/20 10:27:08 15 分钟阅读

分享文章

Go语言基础之结构体
类型别名和自定义类型自定义类型在Go语言中有一些基本的数据类型,如string、整型、浮点型、布尔等数据类型, Go语言中可以使用type关键字来定义自定义类型。自定义类型是定义了一个全新的类型。我们可以基于内置的基本类型定义,也可以通过struct定义。例如://将MyInt定义为int类型 type MyInt int通过type关键字的定义,MyInt就是一种新的类型,它具有int的特性。类型别名类型别名是Go1.9版本添加的新功能。类型别名规定:TypeAlias只是Type的别名,本质上TypeAlias与Type是同一个类型。就像一个孩子小时候有小名、乳名,上学后用学名,英语老师又会给他起英文名,但这些名字都指的是他本人。type TypeAlias = Type我们之前见过的rune和byte就是类型别名,他们的定义如下:type byte = uint8 type rune = int32类型定义和类型别名的区别(*)类型别名与类型定义表面上看只有一个等号的差异,我们通过下面的这段代码来理解它们之间的区别。使用 type 关键字创建新类型,语法为 type NewType ExistingType。 新类型与原类型底层结构相同,但属于不同的类型,不能直接互相赋值或比较,需要显式转换。 type MyInt int var a int = 10 var b MyInt = MyInt(a) // 需要显式转换 类型定义会继承原类型的方法集合,但新类型可以定义自己的方法。 类型别名(Type Alias) 使用 type 关键字和等号 = 创建类型别名,语法为 type Alias = ExistingType。 别名与原类型完全等价,可以直接互相赋值或比较,无需转换。 type MyIntAlias = int var a int = 10 var b MyIntAlias = a // 无需转换 主要区别 语义不同 类型定义创建独立的新类型,类型别名仅是现有类型的另一个名称。 类型检查 类型定义需要显式转换才能与原类型交互,类型别名可以直接交互。 方法集 类型定义可以扩展或覆盖方法,类型别名不能新增方法。 适用场景 类型定义适合需要类型安全或扩展行为的场景,类型别名适合代码重构或简化复杂类型声明。 类型定义 ( type NewType OldType ) 创建了一个全新的类型。 它虽然拥有和原类型相同的底层结构,但在类型检查时是完全独立的。 如果你想给新类型添加方法,必须使用类型定义。 类型别名 ( type Alias = OldType ) 只是原类型的一个符号引用。 在代码编译后,别名会直接被替换回原类型。它们在任何地方都是等价的,不需要转换,也共享方法。 它主要用于大型项目的包重构。 一句话总结: 类型定义是**“生了个新孩子” (长得像但不是同一个人),类型别名是 “起了个小名”**(就是同一个人)。结果显示a的类型是main.NewInt,表示main包下定义的NewInt类型。b的类型是int。MyInt类型只会在代码中存在,编译完成时并不会有MyInt类型。结构体Go语言中的基础数据类型可以表示一些事物的基本属性,但是当我们想表达一个事物的全部或部分属性时,这时候再用单一的基本数据类型明显就无法满足需求了,Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称struct。 也就是我们可以通过struct来定义自己的类型了。Go语言中通过struct来实现面向对象。结构体的定义- 结构体是 Go 中把多个字段组合在一起的复合类型。- Go 没有传统 class ,结构体是最核心的数据组织方式。- 结构体既可以表示数据,也可以通过方法表现“行为”。使用type和struct关键字来定义结构体,具体代码格式如下:type 类型名 struct { 字段名 字段类型 字段名 字段类型 … }其中:类型名:标识自定义结构体的名称,在同一个包内不能重复。字段名:表示结构体字段名。结构体中的字段名必须唯一。字段类型:表示结构体字段的具体类型。举个例子,我们定义一个Person(人)结构体,代码如下:type person struct { name string city string age int8 }同样类型的字段也可以写在一行,type person1 struct { name, city string age int8 }这样我们就拥有了一个person的自定义类型,它有name、city、age三个字段,分别表示姓名、城市和年龄。这样我们使用这个person结构体就能够很方便的在程序中表示和存储人信息了。语言内置的基础数据类型是用来描述一个值的,而结构体是用来描述一组值的。比如一个人有名字、年龄和居住城市等,本质上是一种聚合型的数据类型字段可见性 :字段名首字母 大写 表示公有(导出的),外部包可访问;首字母 小写 表示私有(不导出的),仅本包可见。结构体实例化只有当结构体实例化时,才会真正地分配内存。也就是必须实例化后才能使用结构体的字段。结构体本身也是一种类型,我们可以像声明内置类型一样使用var关键字声明结构体类型。var 结构体实例 结构体类型基本实例化(零值声明)type person struct { name string city string age int8 } func main() { var p1 person p1.name = "沙河娜扎" p1.city = "北京" p1.age = 18 fmt.Printf("p1=%v\n", p1) //p1={沙河娜扎 北京 18} fmt.Printf("p1=%#v\n", p1) //p1=main.person{name:"沙河娜扎", city:"北京", age:18} }

更多文章