go基础

Go语言发展简史
2007年,谷歌工程师Rob Pike, Ken Thompson和Robert Grisemer开始设计一门全新的语言,这是Go语言的最初原型。
2009年11月,Google将Go语言以开放源代码的方式向全球发布。
2015年8月,Go1.5版发布,本次更新中移除了”最后残余的c代码”
2017年2月,Go语言Go 1.8版发布。
2017年8月,Go语言Go 1.9版发布。
2018年2月,Go语言Go1.10版发布。
2018年8月,Go语言Go1.11版发布。
2019年2月,Go语言Go1.12版发布。
2019年9月,Go语言Go1.13版发布。
2020年2月,Go语言Go1.14版发布。
2020年8月,Go语言Go1.15版发布。
….一直迭代
Go语言的吉祥物 - 金花鼠Gordon。

Alt text

数据类型

Alt text

基本类型转string类型

方式1:fmt.Sprintf(“%参数”,表达式)
方式2:使用strconv包的函数

string类型转基本类型

strconv.ParseBool()
strconv.ParseInt()
strconv.ParseFloat()

指针

指针就是内存地址

& 取内存地址

  • 根据地址取值
    指针变量的地址不可以不匹配
    1
    2
    3
    4
    5
    6
    var age int = 18
    var ptr *int = &age
    fmt.Println(ptr)
    fmt.Println("ptr本身这个存储空间的地址为:",&ptr)
    //想获取ptr这个指针或者这个地址指向的那个数据:
    fmt.Printf("ptr指向的数值为:%v",*ptr) //ptr指向的数值为:18

函数

  • init函数

初始化函数,可以用来进行一些初始化的操作
每一个源文件都可以包含一个init函数,该函数会在main函数执行前,被Go运行框架调用。

  • 闭包

闭包就是一个函数和与其相关的引用环境组合的一个整体

  • defer关键字

为了在函数执行完毕后,及时的释放资源
遇到defer关键字,会将后面的代码语句压入栈中,也会将相关的值同时拷贝入栈中,不会随着函数后面的变化而变化。

  • 可变参数
1
2
3
4
5
6
7
8
9
/定义一个函数,函数的参数为:可变参数 ...  参数的数量可变
//args...int 可以传入任意多个数量的int类型的数据 传入0个,1个,,,,n个
func test (args...int){
//函数内部处理可变参数的时候,将可变参数当做切片来处理
//遍历可变参数:
for i := 0; i < len(args); i++ {
fmt.Println(args[i])
}
}
  • 基本数据类型和数组默认都是值传递的,即进行值拷贝。在函数内修改,不会影响到原来的值

如果希望在函数内的变量能修改函数外的变量,可以传入变量的地址&,函数内以指针的方式操作变量。从效果来看类似引用传递

数组

var 数组名 [数组大小]数据类型

切片

可变数组

  • 定义切片
    1
    2
    3
    4
    5
    6
    7
    8
    1、引用一个创建好的数组
    var arr [4] int = [3]int{1,2,3,4}
    slice := arr[1:3]
    2make内置函数
    var切片名[type = make([], len,[cap])
    slice := make([]int,4,20)
    3、直接指定具体的数组
    slece := []int{1,2,3}
  • len cap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
	slice := make([]int, 10)
printSlice(slice)
for i := 0; i < 5; i++ {
slice[i] = i + 100
}
printSlice(slice)
slice = append(slice, 1, 2, 3)
printSlice(slice)
slice = slice[2:]
printSlice(slice)
slice = slice[:3]
printSlice(slice)

slice: [0 0 0 0 0 0 0 0 0 0] len: 10 cap: 10
slice: [100 101 102 103 104 0 0 0 0 0] len: 10 cap: 10
slice: [100 101 102 103 104 0 0 0 0 0 1 2 3] len: 13 cap: 20
slice: [102 103 104 0 0 0 0 0 1 2 3] len: 11 cap: 18
slice: [102 103 104] len: 3 cap: 18

可以看出
len 计算的是当前数组元素的个数,
cap计算的是当前切片开始位到数组最后一个元素的个数

通过函数传递的时候 实际上传递的是底层的数组 所以当函数内部的slice如果发生扩容的话 将和外部的slice彻底成两个独立的slice

结构体

//定义老师结构体,将老师中的各个属性 统一放入结构体中管理:

1
2
3
4
5
6
7
type Teacher struct{
//变量名字大写外界可以访问这个属性
Name string
Age int
School string
}