参考网址
blog.csdn.net/weixin_4569…
0/前言
type关键字是go语言中非常重要而且常用的关键字。
Go语言中`type`关键字用于定义一个类型,因此又称为类型别名。
理解了`type`关键字就会很容易理解Go语言中的函数、结构体struct、接口interface等。
1/定义一个新的数据类型
定义类型的语法是:
type newtype basetype
从上面的语法中,我们可以看到,定义类型是基于basetype来定义一个全新的类型newtype
虽然newtype是基于basetype而来的,但是二者从本质来说是2个不同的类型。
package main
import "fmt"
type zhangsan int
var a zhangsan = zhangsan(10)
var b int = int(b)
func main() {
fmt.Printf("n = %v, type = %T\n", a, a)
fmt.Printf("i = %v, type = %T\n", b, b)
}
# 输出的结果是:
n = 10, type = main.zhangsan
i = 10, type = int
2/给类型起别名
使用type关键字来定义类型别名,语法是:
type zhangsan = int
上面这个语法就是给一个已有的数据类型起一个别名。
我们可以看到,定义类型和给已有类型起别名只有一个符号的差别,二者的区别在于定义类型会产生一个新的类型,
新的类型依然具备原有类型的特性。
而给类型别名只是给类型起了一个别的名字罢了,别名和原始类型仍旧是同一种类型。
本质上,zhangsan和int是同一种类型,就像一个孩子小时候有小名,乳名,上学后用学名,英语老师有给起了英文名,,但这些名字都是同一个人。
package main
import "fmt"
type NewInt int
type IntAlias = int
func main(){
var x NewInt
var y IntAlias
fmt.Printf("x type is %T\n", x)
fmt.Printf("y type is %T\n", y)
}
3/结构体
<1>什么是结构体
我们都知道,数组和切片slice只能存储同一类型的变量。
如果把数组和切片看成是一个篮子,那么篮子中只能放同一种东西,比如都放西瓜,或者都放苹果。
若要存储不同类型的变量,就需要用到结构体,它是把多种类型的变量组合在一起的聚合类型变量。
每个变量都是该结构体的成员之一。
<2>定义结构体
语法为:
type 结构体名字 struct {
属性1 属性1的类型
属性2 属性2的类型
。。。
}
比如我要定义一个可以存储个人信息的结构体,可以像以下这样写:
type profile struct {
name string
age int
gender string
mother *profile
father *profile
}
如果相邻的字段的类型相同,则可以放在一起写,当然也可以分开写
type Profile struct {
name, gender string
age int
mother *Profile
father *Profile
}
<3>结构体初始化
最常用的方式:
package main
type person struct {
name string
city string
age int8
}
func main() {
var p1 person
p1.name = "zhangsan"
p1.city = "beijing"
p1.age = 20
fmt.Println(p1)
p1 := person{
name : "zhangsan",
city: "beijing",
age : 25,
}
p1 := person{
name : "zhangsan",
city: "beijing",
age : 25 }
}
注意:定义的结构体中的字段,不一定要全部都赋值。没有赋值的默认为空
4/结构体的方法