1、type關鍵字
type關鍵字常用於
定義結構體
定義介面
定義型別別名
型別定義
型別判斷
1.1、型別別名
別名可以讓使用者更好理解程式碼,提高程式碼的可讀性和可維護性,在編譯的時候,會將別名編譯為原來的型別
//以定义int的别名举例
type MyInt = int
var i MyInt
fmt.Println("%T\n", i)
//上面代码输出的结果为int,相当一给int取了一个小名,MyInt本质上还是int
1.2、自定義型別
自定義型別是一種新的資料型別,它是基於已有的型別(如int、string等)建立的,它可以包含多個欄位,每個欄位都有自己的名稱和型別。自定義型別可以用於建立更復雜的資料結構,以滿足特定的需求。
type MyInt int // 相比于类型别名,没有等号
var i MyInt
fmt.Println("%T\n", i)
//上面代码输出的结果为xxxx.MyInt
自定義型別有什麼意義?
可以給資料型別增加方法,使用更加靈活
func (mi MyInt) string() string{
return strconv.Itoa(int(mi))
}
func main(){
var i MyInt = 10
fmt.Println(i.string())
}
// 上面的代码给MyInt增加了一个string方法,这样就可以将MyInt类型转换为string类型
2、結構體的定義和初始化
go中的結構體借鑑了物件導向的特性和C語言結構體的簡潔性
假設要設計一個結構體儲存個人資訊,包括name、age、address、mobile等,那麼可以使用如下方式定義結構體:
type Person struct{
name string
age int
address string
mobile string
}
func main(){
//结构体的初始化方式
p1 := Person{"小明", 18, "北京", "13812345678"} //省略写法每个元素都要写
p2 := Person{name: "小红", age: 19, address: "上海", mobile: "13812345679"} //能够填部分元素,更灵活
var p3 Person
p3.name = "小刚"
var persons []Person
persons = append(persons, p1)
persons = append(persons, Person{"小刚", 20, "广州", "13812345680"})
}
3、匿名結構體
定義臨時的一次性的結構體
address := struct{
province string
city string
district string
}{
"北京",
"北京",
"海淀区"
}
fmt.Println(address.city)
4、結構體巢狀
結構體可以在一個結構體中巢狀另一個結構體
type Person struct{
name string
age int
}
// 可以不用重复定义
type Student struct{
// 第一种嵌套方式
p Person
score float32
}
func main() {
// 第一种初始化方式
s := Student{
p: Person{
name: "小明",
age: 18,
},
score: 90,
}
fmt.Println(s.p.name)
// 第二种初始化方式
s := Student{}
s.p.name = "小明"
}
匿名巢狀
type Person struct{
name string
age int
}
// 可以不用重复定义
type Student struct{
// 第二种嵌套方式--匿名嵌套
Person
score float32
}
func main() {
// 初始化方式
s.name = "小明"
}
5、結構體 定義 “方法”
給結構體定義一個方法
在go中定義結構體的方法是在結構體外進行定義的
type Person struct{
name string
age int
}
func (p Person) print(){
fmt.Printf("姓名:%s, 年龄:%d\r\n", p.name, p.age)
}
func main() {
p := Person{
name: "小明",
age: 18,
}
p.print()
}
想要在結構體方法中修改結構體的屬性,需要使用指標型別的結構體
type Person struct{
name string
age int
}
func (p *Person) print(){
p.age = 19
fmt.Printf("姓名:%s, 年龄:%d\r\n", p.name, p.age)
}
func main() {
p := Person{
name: "小明",
age: 18,
}
p.print()
}
//此时输出的结果为:姓名:小明, 年龄:19