go:自定义类型,结构体struct

1,558 阅读3分钟

参考网址

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 //这里是基于数据类型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 }
}
注意:定义的结构体中的字段,不一定要全部都赋值。没有赋值的默认为空

4/结构体的方法