type关键字是go语言中非常重要而且常用的关键字。
Go语言中`type`关键字用于定义一个类型,因此又称为类型别名。
理解了`type`关键字就会很容易理解Go语言中的函数、结构体struct、接口interface等。

1/定义一个新的数据类型

定义类型的语法是:
   type newtype basetype
从上面的语法中,我们可以看到,定义类型是基于basetype来定义一个全新的类型newtype
虽然newtype是基于basetype而来的,但是二者从本质来说是2个不同的类型。
package main
import "fmt"
type zhangsan int //这里是基于数据类型int,定义了一个新的数据类型 zhangsan
var a zhangsan = zhangsan(10)  
// 等同于 var a zhangsan = 100,及a变量的数据类型是zhangsan, 值是10
var b int = int(b)  // 等同于 var b int = 500
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)  //x type is main.NewInt
    fmt.Printf("y type is %T\n", y)  //y type is int
// 因为IntAlias只是类型int的别名,所以变量y的类型还是int,而不是IntAlias

3/结构体

<1>什么是结构体

 我们都知道,数组和切片slice只能存储同一类型的变量。
 如果把数组和切片看成是一个篮子,那么篮子中只能放同一种东西,比如都放西瓜,或者都放苹果。
 若要存储不同类型的变量,就需要用到结构体,它是把多种类型的变量组合在一起的聚合类型变量。
 每个变量都是该结构体的成员之一。

<2>定义结构体

type 结构体名字 struct { 属性1 属性1的类型 // 不需要加逗号 属性2 属性2的类型 // 不需要加逗号 比如我要定义一个可以存储个人信息的结构体,可以像以下这样写: type profile struct { name string age int gender string mother *profile // 指针,指向profile这个结构体,也就是说mother当中,有name,age,gender father *profile 如果相邻的字段的类型相同,则可以放在一起写,当然也可以分开写 type Profile struct { name, gender string age int mother *Profile // 指针 father *Profile // 指针

<3>结构体初始化

  最常用的方式:
package main
// 定义一个结构体person
type person struct {
    name string
    city string
    age int8
func main() {
   // 对于上面定义的person这个结构体,可以有很多种用法
   // 第1种:先根据这个结构体声明一个变量,此时这个变量是空的,然后再添加上个个属性和属性值
   var p1 person  // 初始化结构体对象p1
   // 然后给p1对象赋值
   p1.name = "zhangsan"
   p1.city = "beijing"
   p1.age = 20
   fmt.Println(p1)
   // 第2种:逗号不能省略
   // 这种方式:在初始化对象的时候,直接给赋值
   p1 := person{
       name : "zhangsan",
       city: "beijing",
       age : 25,
  // 第3种:逗号可以省略
   p1 := person{
       name : "zhangsan",
       city: "beijing",
       age : 25 }
注意:定义的结构体中的字段,不一定要全部都赋值。没有赋值的默认为空