Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。
类型别名和自定义类型
自定义类型
在Go语言中有一些基本的数据类型,如string、整型、浮点型、布尔等数据类型,Go语言中可以使用type关键字来定义自定义类型。
自定义类型是定义了一个全新的类型。可以基于内置的基本类型定义,也可以通过struct定义。例如:
type MyInt int
通过Type关键字的定义,MyInt就是一种新的类型,它具有int的特性。
类型别名
类型别名规定:TypeAlias只是Type的别名,本质上TypeAlias与Type是同一个类型。
type TypeAlias = Type
类型定义和类型别名的区别
类型别名与类型定义表面上看只有一个等号的差异。
//类型定义
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类型。
结构体
Go语言中的基础数据类型可以表示一些事物的基本属性,但是当我们想表达一个事物的全部或部分属性时,这时候再用单一的基本数据类型明显就无法满足需求了,Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称struct。 也就是我们可以通过struct来定义自己的类型了。
Go语言中通过struct来实现面向对象。
结构体的定义
使用type和struct关键字来定义结构体,具体代码格式如下:
type 类型名 struct {
字段名 字段类型
}
类型名:标识自定义结构体的名称,在同一个包内不能重复。 字段名:表示结构体字段名。结构体中的字段名必须唯一。 字段类型:表示结构体字段的具体类型。
同样类型的字段也可以写在一行,例:
type person1 struct {
name, city string
age int8
}
语言内置的基础数据类型是用来描述一个值的,而结构体是用来描述一组值的。
结构体实例化
只有当结构体实例化时,才会真正地分配内存。也就是必须实例化后才能使用结构体的字段。 结构体本身也是一种类型,我们可以像声明内置类型一样使用var关键字声明结构体类型。
var 结构体实例 结构体类型
匿名结构体
在定义一些临时数据结构等场景下还可以使用匿名结构体。
package main
import (
"fmt"
)
func main() {
var user struct{Name string; Age int}
user.Name = "pprof.cn"
user.Age = 18
fmt.Printf("%#v\n", user)
}
创建指针类型结构体
还可以通过使用new关键字对结构体进行实例化,得到的是结构体的地址。
var p2 = new(person)
fmt.Printf("%T\n", p2) //*main.person
fmt.Printf("p2=%#v\n", p2) //p2=&main.person{name:"", city:"", age:0}
从打印的结果中可以看出p2是一个结构体指针。
需要注意的是,在Go语言中支持对结构体指针直接使用.来访问结构体的成员。
构造函数
Go语言的结构体没有构造函数,可以自己实现。例如:
func newPerson(name, city string, age int8) *person {
return &person{
name: name,
city: city,
age: age,
}
}
总结
本文主要介绍Go语言结构体的基础用法,简单的定义、实例化、类型等。个人学习感受:Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。