day1 - 初探Go | 青训营笔记

477 阅读4分钟

day1 - 初探Go | 青训营笔记

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

写在前面

笔者才疏学浅,如有纰漏,请在评论区指出

什么是Go

Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。

简而言之:简单 、高效、安全、静态链接、跨平台

为什么用Go

许多企业目前使用Go作为后端开发语言,如:字节跳动、腾讯、哔哩哔哩等

拓展:Golang官网上的Why 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语句在大部分语言中大差不差,所以此处一笔带过,下面说一些不太一样的地方

差别

  1. Go中的switch case,在每个case中,break是隐式存在的
  2. 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,有点麻烦

参考

Java HashMap和Go map源码对比

Go Tour

For loop