1. Go语言介绍
1.1 Go语言特点
- 高性能、高并发
- 语法简单、学习周期短
- 有丰富的标准库
- 工具链完善
- 静态链接
- 可快速编译
- 可跨平台
- 自动垃圾回收
1.2 为什么学Go
国内外很多大厂都在用
字节 腾讯 美团 滴滴 百度 B站 oppo 深信服 360 七牛云
Google Facebook
1.3 为什么字节全面拥抱Go
- 最初使用python,由于性能问题换Go
- C++不适合在线web业务
- 早期团队非Java背景
- 性能佳
- 部署简单,学习成本低
- 内部RPC和HTTP框架推广
2. 开发环境配置
2.1 安装Golang
配置goproxy 作用是加快github访问速度 可以不配
2.2 配置Golang编辑器或集成开发环境
2.2.1 VScode Visual Studio Code - Code Editing. Redefined
(需要装插件 优点是可以写Java python go c 等多种语言)
2.2.2 GoLand jetbrains.com/go/
2.2.3 IDEA IntelliJ IDEA – 领先的 Java 和 Kotlin IDE (jetbrains.com)
(装插件后 也可写多种语言程序)
GoLand和IDEA都是Intellij产品 学生用户凭邮箱等可白嫖
2.2.4 云开发环境
3. 基础语法
3.1 Hello word
//声明程序属于哪一个包 main表示程序入口包
package main
//导入fmt包 用于输入输出字符串 格式化字符串
import(
"fmt"
)
func main(){
fmt.Println("Hello word")
}
3.2 变量
package main
import "fmt"
func main() {
// 方法一:指定变量类型 并赋值
var nun1 int = 19
// 方法二:指定变量类型 不赋值 使用默认值
var num2 int
// 方法三:可以不指定变量类型 自动判断
var a = "initial"
// 方法四:省略var 将等号换成 :=
num4 := 4
// 一次声明多个变量
var n1,n2,n3 int
var n4,name,n5 = 10,"mary",7.8
n6,sex := 7.9,"女"
}
3.3 运算符
+ - * / % 与其他语言一致 分别为加减乘除取模
++ -- 两个运算符只能写在变量后面 不能写在变量前面
--a //这是错误写法
< > <= >= != && || ^ 与其他语言一致
& :返回变量存储地址
* :取指针变量对应数值
var age int = 18
fmt.Println("age对应的存储空间地址为:",&age) //age对应的存储空间地址为:0xc0000100b0
var ptr *int = &age
fmt.Println("ptr这个指针指向的具体数值为:",*ptr)
// 常量声明 将var改为const
const h = 3141
3.4 if-else
package main
import "fmt"
func main() {
num := 10
if num<20 {
num--
}else if num ==20{
num++
}else{
fmt.Println(num)
}
// if后必须有空格
// ()可以省略
// 即便代码只有一行 也不能与if写在同一行
}
3.5 for循环(go语言中没有while循环 没有do while循环 只有for)
package main
import "fmt"
func main() {
// 死循环
i := 1
for {
i++
fmt.Println(i)
}
// 已知循环次数
for j := 7;j < 9; j++{
fmt.Println(j)
}
//类while
for i < 10{
i++
}
// 可使用break退出循环 或者用continue 进入下次循环
}
3.6 switch
package main
import "fmt"
func main() {
a := 2
switch a{
case 1:
fmt.Println("1")
case 2:
fmt.Println("2")
case 3:
fmt.Println("3")
default:
fmt.Println("不知道")
}
// 默认不需要加break
// case中可写条件分支
}
3.7 数组
package main
import "fmt"
func main() {
// 定义数组
// 方法一:先定义后赋值
var arr int[5]
// 赋值
arr[4] = 313
// 方法二:定义时赋值
arr2 := [3]int{1,2,4}
// 方法三:未知数目直接赋值
arr3 := [...]int{3,4,5,6,7,8,9}
// 方法四:连续赋值
arr4 := [...]int{2:44,5:35,3:67}
// 二维数组的定义
twoarr := [3][3]int{{23,4,5},
{2,5,6},
{4,4,6}}
//遍历
for key,value := range arr{
// key表示元素下标
// value表示元素值
fmt.Println("第%d个数的值为:%d\n",key,value)
}
}
3.8 切片slice
slice空间可动态改变 所以比数组好使用 但是也有其空间限制 注意不要越界
package main
import "fmt"
func main() {
// 方法一:使用make创建切片
// slice := make([]类型,切片长度,切片容量) 其中容量可省
s := make([]string,3)
// 赋值
s[0] = "a"
s[1] = "b"
s[2] = "c"
// 追加元素append 但是结果必须被接收
// slice容量不够时自动扩容后地址会改变
s = a.append(s,"d")
// 方法二:通过数组转换
arr := [...]int{23,241,3,4,5,2,5,4}
s1 := arr[1:3] // 取arr的第1到第3个创建切片
// 方法三:copy
b := make([]int,5)
copy(b,s1)
// 切片操作
fmt.Println(s[2:5]) //[c d e]
// 从第2个元素起,不包括第5个元素
// 也可以写s[2:] 表示从第2个开始到结束
// 需要注意的是 与Python不同 go语言中-1不表示最后一个元素
// 快速定义
good := []string{"a","s","d","f","g","h"}
// 方法调用
fmt.Println("切片长度:",len(good)) // 切片长度:6
fmt.Println("切片容量:",cap(good))
// 遍历
for i,v := range(good){
fmt.Println("下标:%v,元素:%v\n",i,v)
}
}
3.9 map
map 特点
- 使用前必须make
- key-value无序
- key不可重复,重复后以后者替换前者的value
- value可重复
package main
import "fmt"
func main() {
// 定义
// 方法一:先定义 用时再确定空间
var a = map[int]string
a = make([int]string,10)
// 方法二:定义时确定类型和空间
m := make([int]string,10) //三个参数分别为key类型 value类型 空间大小(可省)
// map操作
// 添加元素
m[18] = "迪丽热巴"
m[20] = "古力娜扎"
m[19] = "马儿扎哈"
m[100] = "老王八"
// 删除元素
delete(b,100)
// 查找元素
value,flag := n[19] //返回的flag为boolean类型
// 获取长度
len(m)
// 遍历
for k,v := range m{
fmt.Println("key:%v,value:%v\n",i,v)
}
}