Go的基础知识 | 青训营笔记

75 阅读2分钟

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

Go

应用程序入口要求

1.必须是main包 : package main

2.必须是main方法: func main()

3.文件名可以自定义

4.main函数不支持任何返回值

5.通过os.Exit来返回状态

6.main方法不可以直接接收命令行参数,可以通过os.Args来获取参数

常用赋值方式

//主要用于不知初始值时,进行全局变量的定义
var a int = 1
var b int = 1//自动识别类型进行初始化和赋值
i := 1

常用测试方法

package Testimport "testing"
​
func TestFibList(t *testing.T) {
    var a int = 1
    var b int = 1t.Log(a)
    for i := 0; i < 5; i++ {
        t.Log(b)
        temp := a
        a = b
        b = temp + a
    }
​
}
//文件命名为xxx_test.go
//主函数名以Test开头

数组

在c语言中我们知道数组名在本质上是数组中第一个元素的地址,而在go语言中,数组名仅仅表示整个数组,是一个完整的值,一个数组变量即是表示整个数组。

所以在go中一个数组变量被赋值或者被传递的时候实际上就会复制整个数组。如果数组比较大的话,这种复制往往会占有很大的开销。所以为了避免这种开销,往往需要传递一个指向数组的指针,这个数组指针并不是数组。

声明

var a[3]int //声明并初始化默认值为0b :=[3]int{1,2,3}
c :=[2][2]int{{1,2},{3,4}}

遍历

func TestArray(t *testing.T) {
​
    a := [5]int{1, 2, 3, 4, 5}
​
    //索引遍历for i := 0; i < len(a); i++ {
        t.Log(a[i])
    }
​
    //range遍历
    for index, e := range a {
        t.Log(index, e)
    }
    //当不想使用索引时
    for _, e := range a {
        t.Log(e)
    }
​
}

切片截取

a[开始索引(包含),结束索引(不包含)]
​
切片和原数组公用同一存储空间,任一元素改变都会影响原始数组
​
不能进行比较

Map

初始化

m1 := map[string]int{"one": 1, "tow": 2, "three": 3}
​
m2 := map[string]int{}
m2["one"] = 1
​
m3 := make(map[string]int, 10)
​
t.Log(m1["one"])
t.Log(m2["one"])
t.Log(len(m3))

函数

差异

1.可以有多个返回值

2.所有参数都是值传递

3.函数可以作为变量的值

4.函数可以作为参数和返回值

与其他语言的区别

1.不支持强制类型转换

2.不支持指针运算

3.string是值类型,默认的初始化为空字符串,并不是nil

4.for循环条件不用括号