Day02-Go基础进阶 | 青训营笔记

69 阅读4分钟

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

Go语言基础进阶

1、函数

在Go语言中,函数的基本组成为:关键字 func、函数名、参数列表、返回值、函数体和返回语句,每一个程序都包含很多的函数,函数是基本的代码块。编写函数的目的是将一个需要很多行代码的复杂问题分解为一系列简单的任务来解决,而且,同一个函数可以被多次调用,有助于代码重用。

函数声明格式: func 函数名(形式参数列表)(返回值列表){     函数体 }

形式参数列表描述了函数的参数名以及参数类型,这些参数作为局部变量,其值由参数调用者提供,返回值列表描述了函数返回值的变量名以及类型,如果函数返回一个无名变量或者没有返回值,返回值列表的括号是可以省略的:

func add(x int, y int) int {
    return x+y
}

Go语言支持对返回值进行命名,这样返回值就和参数一样拥有参数变量名和类型:

func add(a, b int) (c int) {
    c = a+b
    return
}

2、结构体

  • Go 语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。
  • Go 语言的结构体与“类”都是复合结构体,但比面向对象具有更高的扩展性和灵活性。
  • Go 语言结构体能拥有方法,且每种自定义类型也可以拥有自己的方法。

结构体的定义格式如下:

type 类型名 struct {  
    字段1 字段1类型  
    字段2 字段2类型  
    …  
}

结构体各个部分的说明

  • 类型名:标识自定义结构体的名称,在同一个包内不能重复。
  • struct{}:结构体类型,type 类型名 struct{}将 struct{} 结构体定义为类型名的类型。
  • 字段1、字段2……:表示结构体字段名,结构体中的字段名必须唯一。
  • 字段1类型、字段2类型……:表示结构体各个字段的类型。

结构体实例化格式:`var 结构体实例 结构体类型 结构体例子:

//结构体定义
type User struct {
    name string
    password string
}

//创建结构体实例
var user User
user.name = "wang"
user.password = "1234"

3、容器

3.1、数组

数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。数组的声明语法:var 数组变量名 [元素数量]Type

  • Type:可以是任意基本类型,包括数组本身,类型为数组本身时,可以实现多维数组。
func mian() 
    //声明
    var a [5]int 
    //赋值
    a[4] = 100
    
    //定义数组并初始化元素值
    b := [5]int{1,2,2,3,4}
}

因为数组的长度是固定的,所以在Go语言中很少直接使用数组。

3.2、切片

和数组对应的类型是 Slice(切片),切片是对数组的一个连续片段的引用,所以切片是一个引用类型,切片 是可以增长和收缩的动态序列,功能也更灵活。

声明切片:var name []Type

// 声明字符串切片
var strList []string

// 声明整型切片
var numList []int

// 声明一个空切片
var numListEmpty = []int{}

创建切片,还用 make() 内建函数:make( []Type, size, cap ),其中 Type 是指切片的元素类型,size 指的是为这个类型分配多少个元素,cap 为预分配的元素数量,这个值设定后不影响 size,只是能提前分配空间,降低多次分配空间造成的性能问题。示例如下:

a := make([]int, 2)
b := make([]int, 2, 10)
//a b 均是预分配 2 个元素的切片,只是 b 的内部存储空间已经分配了 10 个,但实际使用了 2 个元素。
//不会影响当前的元素个数,因此 a 和 b 取 len 都是 2。

3.3、map

Go语言中 map 是一种特殊元素对(pair)的无序集合,pair 对应一个 key(键)和一个 value(值),所以这个结构也称为关联数组或字典,这是一种能够快速寻找值的理想结构,在其他编程语言中也称为字典、hash 和 HashTable 等,给定 key,就可以迅速找到对应的 value。

map声明:var map名 map[key类型]value类型,map 容量和切片一样是可以动态增长的,未初始化的 map 的值是 nil,所以无需指定容量: map同样可以使用make() 内建函数来创建:make(map[key类型]value类型, 容量cap)

func mian() {
    //创建
    m := make(map[string]int,3)
    
    //赋值
    m["one"] = 1
    m["two"] = 2
    
    //取值
    fmt.Println(m["one"])
    fmt.Println(m["two"])
}
//输出:
1
2