这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
有着“21世纪的c语言”之称的Go语言是一个高性能,高并发的语言,因其接近于++, java的开发性能以及快速上手,简单易学的特性成为不少公司的选择。
为什么是GO?
GO语言的优点
- 高性能、高并发
- 语法简单、简单易学:较c++语言语法更简单,去掉了不必要多种语法,包括括号和while循环
- 丰富的标准库: 无需借助第三方库就可以完成开发,并且标准库稳定
- 完善的工具链: 错误检查、包管理、单元测试、性能测试等工具非常完善
- 静态链接:所有的编译结构都是静态链接的,只需要拷贝编译完成的可执行文件即可
- 快速编译:有着比c和c++语言更快的编译速度,上线之前本地的编译时间非常之快
- 跨平台:windows、macos、linus、路由器、树莓派上都可以编译运行
- 垃圾回收: 较好的垃圾回收机制不用考虑内存分配和释放,可专注于业务逻辑
字节跳动为什么选择Go语言
python性能问题,内部团队非java背景,go语言的学习成本低部署简单,内部RPC和http框架的推广
Go的安装
go.dev 下载go直接安装即可,集成开发环境可选择vscode和GoLand
Go基础语法
go语言可以直接运行也可以编译成可执行文件再运行
编译和运行
go build main.go // 编译
./main // 运行
go run main.go // 直接运行
基础语法-Hello World
导入fmt包,使用fmt.Println可直接输出一行字符串
package main
import (
"fmt"
)
func main() {
fmt.Println("hello world") // 输出hello world
}
fmt包中还有fmt.Printf格式化输出方式,和c语言的printf类似,但较c语言多了一个通用类型的输出%v, 使用时可以在后面接任意类型的变量
基础语法-变量
Go常见的变量类型有字符串string、整数int、浮点float、布尔型bool,变量的声明方式有两种方式:
- var 变量名 变量类型 = 值
var a string = "initial"
// 若后面有初始化值,可不用显式的写出声明的变量类型
// var a = "initial"
- 变量名 := 值
a := "initial"
注:常量只要把var换成const即可
基础语法-if else
判断式没有括号, 括号不能写到同一行
if 7 % 2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
基础语法- 循环
只有for循环, for后不写任何东西就等于while循环
for i := 0; i < n; i++ {
}
for {
break
}
基础语法- switch
默认不需要加break, 判断的变量可以是任意变量类型,并且可以用switch来构造死循环
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
default:
fmt.Println("other")
}
基础语法-数组
var a [5]int // 声明一维数组
var towD [2][3]int //声明二维数组
基础语法-切片
切片是可变长度的数组,相当于c++中的vector,创建长度为3的字符串数组,容量为9,可以不写初始容量,当扩容时容量不够时会自动增加并返还一个新的切片
s := make([]string, 3, 9)
直接对切片进行赋值
s[0] = "a"
s[1] = "b"
s[2] = "c"
可通过append在切片后面追加元素
s = append(s, "d")
s = append(s, "e", "f")
可以直接使用切片操作,但不支持负数索引
fmt.Println(s[2:5]) // [c d e]
基础语法-map
声明和赋值如下, map的key可以是任意类型,包括数组和结构体, 采用_, ok := m[key]可判断是否key在mp中, ok是false时不在
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
m2 := make(map[[26]int] int) // key为长度为26的数组
基础语法-range
可采用range遍历数组和map,语法如下:
for i, num := range nums { // 索引 值
}
for k, v := range m { // 键 值
}