Go基础语法 | 青训营笔记

49 阅读4分钟

这是我参与「第五届青训营 」笔记创作活动的第5天.

变量

变量的声明与定义

Go中声明与定义变量有三种方式 方式1是标准声明方式

var 变量名 变量类型 = 变量初始值

方式2省去了变量类型,由系统进行类型推导

var 变量名 = 变量初始值

方式3为短变量声明

变量名 := 变量初始值

Go中也可对变量进行批量声明,如下

var (
   a int = 10
   b int = 100
   c int = 1000
)

常用数据类型

基础数据类型

基础数据类型包括整型、浮点型、布尔型、字符串等。

整型:在go中,由int定义出的的整型数据范围取决于系统位数(32位系统定义的int是32位的,64位的系统定义的int是64位的)。此外,也可以明确定义一个整型的位数,包括int8、int16、int32、int64等类别,及其对应的无符号整型。

浮点型:go中的浮点数有两种,即float32、float64

布尔型:关键字为bool

字符串:与Java不同,在Go中,字符串属于基本数据类型,底层是一个byte数组或rune数组

复合数据类型

常用的复合数据类型包括array、slice、map、结构体

数组:是同一种数据类型的固定长度的序列

var nums = [4]int{1,2,3,4}
nums := [5]int{1, 2, 3, 4, 5}

注意:数组的长度不可变,且长度是类型的一部分,也就是说[10]int[4]int不是同一种类型

切片:动态数组,长度可变的数组

切片与数组的定义方式很相似,去除方括号中间的数字即可

var nums = []int{1,2,3,4}
nums := []int{1, 2, 3, 4, 5}

也可以通过make()进行定义,len为切片长度,cap为切片容量

slice  := make([]type, len, cap)

map:哈希表,类型为 map[keyType]valueType,方括号中的为键的类型,方括号后的为值的类型

map可以通过make()进行创建

// 定义一个key为string类型,value为int类型的哈希表
myMap := make(map[string]int)

结构体:结构体是一种聚合的数据类型,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员 。

  • 结构体变量的成员可以通过点操作符访问。
  • 结构体中变量名首字母大写,意味着可以导出,消息则不可以导出,是Golang中封装性的体现
  • 结构体变量是值类型的,如果要在其它函数中改变作为参数的结构体变量,需以结构体指针作为形参
type Employee struct {
    ID        int
    Name      string
    Position  string
    Salary    int
    ManagerID int
}

函数

  • 函数声明包括函数名、形式参数列表、返回值列表(可省略)以及函数体。
func name(parameter-list) (result-list) {
    body
}
  • 如果一组形参或返回值有相同的类型,则不必为每个形参都写出参数类型。下面2个声明是等价的
func f(i, j, k int, s, t string)                 { /* ... */ }
func f(i int, j int, k int,  s string, t string) { /* ... */ }
  • 函数的类型被称为函数的签名。如果两个函数形式参数列表和返回值列表中的变量类型一一对应,那么这两个函数被认为有相同的类型或签名。

方法

方法的声明与函数十分类似,在函数名字之前放上一个变量(也叫接收器),即是一个方法。这个附加的参数会将该函数附加到这种类型上,即相当于为这种类型定义了一个独占的方法。

type Point struct{ X, Y float64 }

func (p Point) Distance(q Point) float64 {
    return math.Hypot(q.X-p.X, q.Y-p.Y)
}

func (p *Point) ScaleBy(factor float64) {
    p.X *= factor
    p.Y *= factor
}
  • 与结构体中的成员变量一样,方法名大写,意味着该方法是可以导出的。

  • 我们最好将接收器定义为指针类型,这样可以避免拷贝带来的资源消耗,也能在方法中修改接收器的值。

  • 我们可以在一个结构体A中嵌套另一个结构体B,这样A可以拥有B中的所有成员变量与方法,体现了继承性

接口

接口类型是一种抽象的类型。它不会暴露出它所代表的对象的内部值的结构和这个对象支持的基础操作的集合;它们只会表现出它们自己的方法。也就是说当你有看到一个接口类型的值时,你不知道它是什么,唯一知道的就是可以通过它的方法来做什么。

  • 定义接口时只需要定义函数签名,例如sort包中的Interface 接口
type Interface interface {
    Len() int
    Less(i, j int) bool
    Swap(i, j int)
}
  • golang中接口的实现是隐性的,一个类型如果拥有一个接口需要的所有方法,那么这个类型就实现了这个接口。