day1 - 初探Go | 青训营笔记
这是我参与「第五届青训营」伴学笔记创作活动的第 1 天
写在前面
笔者才疏学浅,如有纰漏,请在评论区指出
什么是Go
Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。
简而言之:简单 、高效、安全、静态链接、跨平台
为什么用Go
许多企业目前使用Go作为后端开发语言,如:字节跳动、腾讯、哔哩哔哩等
不难看出,各大企业选择Go作为后端开发语言的原因是其简单、高效、可靠
IDE的选择
对于Go语言来说,可以选择主流的两大IDE:Microsoft家的Visual Studio Code 和Jetbrains家的GoLand
前者免费,后者需要付费,如果有Jetbrains学生认证我本人更推荐使用后者
当然,除了IDE,也可以选择一些不错的文本/代码编辑器,如Sublime Text 3
编写Hello World
package main
import (
"fmt"
)
func main(){
fmt.Println("Hello World")
}
与其他语言相同,Go的入口点是main函数
变量
与我所熟知的大多数语言不同,Go的类型是后置的
这里拿C#和Go做对比
var a string = "aaa"
var b int = 114514
var c = true
d := 1 + 1
这些都是合法的Go变量声明,而且可以看出,Go支持类型推断
而在C#中,变量是这样定义
var a = "aaa";
int b = 114514;
string c = "ccc";
var d = true;
可以看出,C#中类型是在前,变量名在后,同样支持类型推断,但C#中并没有 := 这种声明且赋值
但并不是所有语言都是变量类型在前,这里仅用C#与Go做对比
流程控制
Go支持if;else;else if;switch语句
if else
初见if else时,因为其 () 是可选的,我甚至以为自己在写Python
if 9 % 2 == 1:
print("odd")
else:
print("even")
switch
switch语句在大部分语言中大差不差,所以此处一笔带过,下面说一些不太一样的地方
差别
- Go中的switch case,在每个case中,break是隐式存在的
- Go中的switch case,可以在case中,使用fallthrough关键字继续执行下一条case中的内容
!!需要注意的是,fallthrough关键字 不能 出现在最后一个case,且fallthrough在执行下一条case时,不会 判断是否满足条件
循环
不同于我所熟知的大多数语言,Go中的循环只有for
如果希望使用死循环
for{
//code here
}
我们仍可以定义C-style loop
for initialization; condition; expression{
statement
}
在这段循环中,initialization; condition; expression都是 可省略 的
数组
数组的 长度是固定且不可改变的 ,且 储存的类型是一致的 ,也就是说,当在定义一个array时,它的长度就已经确定了
不止在go,在C#,Java,C/C++中,都是相通的
var arr [5]int
int arr[5];
int[] arr = new int[5];
int[] arr = new int[5];
切片
切片相较于数组,他的长度并不固定,也就是说我们可以对其进行追加,删除等 切片使用make初始化,即
//type -> 类型
//length -> 长度
s := make([]type,length)
Go同样支持类似Python的切片操作,如
s := make([]int,5)
fmt.Println(s[1:3])
fmt.Println(s[1:])
fmt.Println(s[:3])
但也存在不同,Go 不支持 Python中的负数索引
一点话外:
其实最开始看到切片的时候,我想到了C#中的List和C++中的vector,我也不知道自己想的对不对,待以后深入讨论
map
map在其他的语言中,可能被称为HashMap(Java)或者Dictionary(C#) Go中,map的定义也是需要用到make
//m := make(map[keytype]valuetype)
//如
m := make(map[string]int)
//存取值时,可以使用m[key] = value
//如
m["a"] = 1
需要注意的是,Go中的Map是 无序的
range
对于一个 slice 或者一个 map 的话,使用 range 来进行快速遍历 当 range 遍历的时候,对于数组会返回两个值,分别是索引和值 对于 map ,返回的两个值分别是 key 和 value
函数与指针
在Go中,函数的基本构成是
func funcName(parameter) returnValue{
}
像C一样,Go也有指针,存储着内存地址
i, j := 42, 2701
p := &i
*p = 21
p = &j
*p = *p / 37
但与C不同的是,Go 没有 指针运算
结构体
Go中结构体的定义格式为
type structName struct {
}
样例
type Vertex struct {
X int
Y int
}
像C一样,结构体亦可以在传参时传入指针
一些想法
Go在有其他语言基础时,入门确实是很快的,容易上手,但有一些格式与笔者本人常用语言是 "反过来的" ,也确实需要适应一段时间
一点牢骚(
然后就是掘金什么时候能视频网页全屏,player的原始宽高太小,全屏有太大,而且我经常切OneNote和GoLand,有点麻烦