Go
中没有类的概念,不支持面向对象OOP
。Go
语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。Go
语言中通过struct
来实现面向对象。 结构体是复合类型,由一系列属性组成,每个属性都有自己的类型和值,结构体通过属性把数据聚集在一起。 结构体是值类型,可以通过new
函数进行创建。
Go中的基本数据类型有string、整型、浮点型、布尔型
等,类型可以自定义,通过type
关键字实现:
type MyInt int //将MyInt 定义为int类型,它具有int类型的特性
类型别名规定TypeAlias
是Type
的别名。比如byte
是uint8
的别名,rune
是int32
的别名,别名的定义
type TypeAlias = Type
//栗子
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
}
定义结构体使用的是type
和struct
语句。
struct
语句定义一个新的数据类型,结构体有中有一个或多个成员type
语句设定了结构体的名称,用来自定义一个全新的类型type 类型名 struct {
field1 type1 //字段名 字段类型
field2 type2
_ type3 //用不到的字段用_表示
field2 type4
…
}
//空结构体创建
struct {}
匿名字段
_
表示看一个具体的栗子:关于Person
的结构体
type person struct {
name string
city string
age int8
}
// 同样类型的字段可以在同一行
type person1 struct {
name, city string
age int8
}
没有初始化的结构体,其成员变量都是对应其类型的零值。
package main
import "fmt"
type Books struct {
//title, author, subject string 类型相同可以写到一行
title string
author string
subject string
book_id int8
}
func main(){
//1、直接写出对应的字段的值values
//必须初始化结构体的所有字段
//填充顺序和字段在结构体中的顺序相同
//不能和键值对的方式混合使用
fmt.Println(Books{
"go 语言",
"小明",
"go 教程",
1})
//2、通过keys-values进行创建
fmt.Println(Books{
title: "go 语言",
author: "小明",
subject: "go 教程",
book_id: 1})
// 3、忽略的字段为 0 或 空
fmt.Println(Books{
title: "Go 语言",
author: "小明"})
p := &Books{
title: "go 编程",
author: "Peter", //逗号一定要带上
}
fmt.Printf("%#v\n", p)
}
只有当结构体实例化时,才会真正地分配内存。也就是必须实例化后才能使用结构体的字段。结构体本身也是一种类型,可以通过关键字var
来声明结构体类型。类比Python
的中类和类的实例化。
package main
import "fmt"
//定义结构体
type person struct {
name string
city string
email string
age int8
}
func main(){
var p1 person //实例化结构体
p1.name = "小明" //访问结构体中的字段,通过.来实现
p1.city = "深圳"
p1.email = "123456@qq.com"
p1.age = 20
fmt.Printf("p1=%v\n", p1) //%v打印的数据更清晰
fmt.Printf("p1=%#v\n", p1)
fmt.Println(p1.name) //直接通过结构体的属性
fmt.Println(p1.age)
//匿名结构体:临时使用
var user struct{
name string
married bool
}
user.name = "张三"
user.married = false
fmt.Printf("%#v\n", user)
}