这是我参与「第五届青训营」笔记创作活动的第1天!
从今天开始进行青训营go语言的系统学习,笔记中有视频课的相关知识点,也有我自己个人的一些心得和体会和大家一起分享。
要学习,先找总路线。
本节课学习路线
1.Go的简介
什么是 Go
Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
Go 的特点
Go 的应用场景
字节、谷歌、Facebook、腾讯、七牛云、哔哩哔哩等公司都在使用
在云计算、微服务、大数据等领域都有很大的发展空间
2.Vscode上配置Go环境
这里因为我用的Windows系统,所以按照这个去配置(其它系统其实大同小异)
安装 Go 语言
- 访问 go.dev/ ,点击 Download ,下载对应平台安装包,安装即可
- 如果无法访问上述网址,可以改为访问 studygolang.com/dl 下载安装
- 如果访问 github 速度比较慢,建议配置 go mod proxy,参考 goproxy.cn/ 里面的描述配置,下载第三方依赖包的速度可以大大加快
(这里的环境变量一定要记得更改!)
改完之后记得在终端输入go env查一下这两个改好了没
配置 Go 环境
这里Vscode的安装不赘述,网上都有教程。
在Vscode扩展商店里记得安装Go插件
然后就可以把老师给的github上的案例clone到本地了(或者你也可以手打熟悉熟悉)
这里克隆到本地用Git Bash就可以也比较容易给大家一篇文章参考 (如何克隆GitHub上的项目到本地_打白i的博客-CSDN博客_克隆git hub的项目)
案例克隆到本地后用Vscode打开之后就是这样
Vscode右下角会提示你下一些东西(这里建议直接install all就行,下的有些慢等一会就好了)
下好之后就可以运行演示了 (两种方式)
1.新建一个终端输入 go run example/01-hello/main.go
2.直接插件商店里下一个code runner点右上角三角符号也能运行(我自己用的这个)
运行结果如下:
输出hello world就说明Vscode下Go环境配置成功了!
3.Go语法基础
一个“Hello World”的基本结构
package main //当前包
import (
"fmt" //外部依赖包
)
//主函数
func main() {
fmt.Println("hello world") //输出
}
变量与常量
Go语言是一门静态强类型语言,常见的变量类型包括整型,字符串,浮点型,布尔类型等。其声明方式主要有两种:
var声明语句可以创建一个特定类型的变量,然后给变量附加一个名字,并且设置变量的初始值。变量声明一般几种语法如下:
var 变量名 类型 = 值(显示声明)var 变量名 = 值(根据赋值自动确定类型)变量名 : = 值(省略var,不可用于声明全局变量)
var a = "initial"
var b, c int = 1, 2
var d = true
var e float64
f := float32(e)
g := a + "foo"
fmt.Println(a, b, c, d, e, f) // initial 1 2 true 0 0
fmt.Println(g) // initialapple
用const定义常量,可使用const与iota方便地定义枚举:
const ca int = 1
// iota 初始为0,逐行递增
const (
a, b = iota, iota+1 // 0, 1
c, d // 1, 2
e, f = iota * 10, iota * 20 // 20, 40
g, h // 30, 60
)
if-else语句和循环语句
Go 的if-else语句与c++的类似,区别是没有括号
if 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
if 8%4 == 0 {
fmt.Println("8 is divisible by 4")
}
Go 的循环语句只有for,没有while和do while
几种不同的用法
//死循环
i := 1
for {
fmt.Println("loop")
break
}
//类似c++的for循环
for j := 7; j < 9; j++ {
fmt.Println(j)
}
//也可使用c++中的continue和break
for n := 0; n < 5; n++ {
if n%2 == 0 {
continue
}
fmt.Println(n)
}
//不同的写法,将起始条件前置,将循环条件后置
for i <= 3 {
fmt.Println(i)
i = i + 1
}
switch分支语句
Go 的switch case可以使用任意的变量类型,也可以省略 switch 后的变量,每个 case 作为一个独立的分支判断(但只执行第一个符合条件的)
a := 2
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
case 3:
fmt.Println("three")
case 4, 5:
fmt.Println("four or five")
default:
fmt.Println("other")
}
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("It's before noon")
default:
fmt.Println("It's after noon")
}
数组与切片
数组基本用法
//一维数组
var a [5]int
a[4] = 100
fmt.Println("get:", a[2])
fmt.Println("len:", len(a))
b := [5]int{1, 2, 3, 4, 5}
fmt.Println(b)
//二维数组
var twoD [2][3]int
for i := 0; i < 2; i++ {
for j := 0; j < 3; j++ {
twoD[i][j] = i + j
}
}
fmt.Println("2d: ", twoD)
切片不同于数组,可任意改变长度,可以理解为"动态数组"
数组名 := make([]string, 数组长度)
copy(数组1,数组2) 这样数组1就会直接复制数组2的元素
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get:", s[2]) // c
fmt.Println("len:", len(s)) // 3
//append直接增加长度和新的数组元素
s = append(s, "d")
s = append(s, "e", "f")
fmt.Println(s) // [a b c d e f]
c := make([]string, len(s))
copy(c, s)
fmt.Println(c) // [a b c d e f]
fmt.Println(s[2:5]) // [c d e]
fmt.Println(s[:5]) // [a b c d e]
fmt.Println(s[2:]) // [c d e f]
good := []string{"g", "o", "o", "d"}
fmt.Println(good) // [g o o d]
map和range
1. map 中的数据不会自动排列,其顺序是随机的
2. 也可以使用 range 来遍历 map(使代码更简洁)
map语法格式
map名 := make(map[key的类型]值的类型)
在Go语言中,一个map就是一个哈希表的引用,map类型可以写为map[K]V,其中K和V分别对应key和value。map中所有的key都有相同的类型,所有的value也有着相同的类型,但是key和value之间可以是不同的数据类型。
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
fmt.Println(m) // map[one:1 two:2]
fmt.Println(len(m)) // 2
fmt.Println(m["one"]) // 1
fmt.Println(m["unknow"]) // 0
r, ok := m["unknow"]
fmt.Println(r, ok) // 0 false
//删除后为map[two:2]
delete(m, "one")
fmt.Println(m)
range起到遍历作用
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
fmt.Println(k, v) // b 8; a A
}
for k := range m {
fmt.Println("key", k) // key a; key b
}
小结
第一天的学习工作量还是很大,这里先做个小结。这节主要是进行了对Go语言的了解和Go环境的配置,也进行了Go语言基础语法的部分学习。个人感觉Go语言现在的应用范围广,很有前景,因为有过C和Java的学习基础,在Go语言的学习上,能找到一些共同之处,但Go在语法的一些使用上也有其自身的特点,还需不断学习和熟练。加油!