一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
Go学习打卡Day05 结构体
Go语言中没有像C++语言class的概念,也不支持class的继承等面向对象的概念。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。
1、类型别名和自定义类型
自定义类型
type LL int64
通过type关键字的定义,LL就是一种新的类型,它具有int64的特性。
类型别名
类似于C++中的typedef或者using
type LL = int64
package main
import (
"fmt"
)
type LL int64
type ll = int64
func main() {
var a LL
var b ll
fmt.Printf("type of a : %T\n", a)
fmt.Printf("type of b : %T\n", b)
}
//type of a : main.LL
//type of b : int64
ll类型只会在代码中存在,编译完成时并不会有ll类型。
2、结构体
Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称struct。
定义结构体
type 类型名 struct {
字段名 字段类型
字段名 字段类型
…
}
type Student struct {
name, id string
age int
}
其中:
- 类型名:标识自定义结构体的名称,在同一个包内不能重复。
- 字段名:表示结构体字段名。结构体中的字段名必须唯一。
- 字段类型:表示结构体字段的具体类型。
结构体实例化
package main
import (
"fmt"
)
type Student struct {
name, id string
age int
}
func main() {
var stu Student
stu.name = "Coke"
stu.id = "cc"
stu.age = 18
fmt.Printf("stu = %v\n", stu)
fmt.Printf("stu = %#v\n", stu)
}
//stu = {Coke cc 18}
//stu = main.Student{name:"Coke", id:"cc", age:18}
匿名结构体
package main
import (
"fmt"
)
func main() {
var stu struct {
name string
age int
}
stu.name = "Cola"
stu.age = 18
fmt.Printf("stu = %#v\n", stu)
}
//stu = struct { name string; age int }{name:"Cola", age:18}
指针与结构体
package main
import (
"fmt"
)
type Student struct {
name, id string
age int
}
func main() {
var ptr = new(Student)
fmt.Printf("%T\n", ptr)
fmt.Printf("ptr = %#v\n", ptr)
var p = new(Student)
p.age = 18
p.name = "Coke"
p.id = "Cc"
fmt.Printf("p = %#v\n", p)
p_ := &Student{}
fmt.Printf("%T\n", p_)
fmt.Printf("p_ = %#v\n", p_)
p_.age = 10
p_.id = "Cc"
p_.name = "Cola"
fmt.Printf("p_ = %#v\n", p_)
}
/*
*main.Student
ptr = &main.Student{name:"", id:"", age:0}
p = &main.Student{name:"Coke", id:"Cc", age:18}
*main.Student
p_ = &main.Student{name:"", id:"", age:0}
p_ = &main.Student{name:"Cola", id:"Cc", age:10}
*/
3、结构体初始化
-
没有初始化的结构体,其成员变量都是对应其类型的零值。
-
使用键值对对结构体进行初始化时,键对应结构体的字段,值对应该字段的初始值。
-
初始化结构体的时候可以简写,也就是初始化的时候不写键,直接写值,使用这种格式初始化时,需要注意:
- 必须初始化结构体的所有字段。
- 初始值的填充顺序必须与字段在结构体中的声明顺序一致。
- 该方式不能和键值初始化方式混用。
-
空结构体是不占用空间的。
package main
import "fmt"
type Student struct {
name, id string
age int
}
func main() {
p1 := Student{
name: "Coke",
id: "Cc",
age: 18,
}
p2 := &Student{
"Coke",
"Cc",
20,
}
fmt.Println(p1)
fmt.Println(p2)
}
/*
{Coke Cc 18}
&{Coke Cc 20}
*/