一、简介
1、什么是Go语言
Go语言的特点:
-
高性能、高并发
-
语法简单、学习曲线平缓
-
丰富的标准库
-
完善的工具链
-
静态链接
-
快速编译
-
跨平台
-
垃圾回收
2、哪些公司在使用Go语言
Go语言有哪些公司正在使用:
- 字节跳动
- 谷歌
- 腾讯
- 美团
- 七牛云
- 滴滴
- 哔哩哔哩
- 百度
- PingCAP
- ......
首先字节跳动已经全面拥抱了 go 语言,公司内部有上万个微服务使用 golang 来编写,不久前也开源了 GO RPC 框架 KiteX。
根据拉勾的招聘数据,腾讯、百度、美团、滴滴、深信服、平安、OPPO、知乎、去哪儿、360、金山、微博、哔哩哔哩、七牛、PingCAP 等公司也在大量使用 Go 语言。国外 Google、Facebook 等公司也在大量使用 Go 语言。
Go语言的主要应用场景:
从业务维度看,Go 语言已经在云计算、微服务、大数据、区块链、物联网等领域蓬勃发展。然后在云计算、微服务等领域已经有非常高的市场占有率。
Docker、Kubernetes、Istio、etcd、prometheus 几乎所有的云原生组件全是用 Go 实现的。
3、字节跳动为什么全面拥抱Go语言
- 最初使用的Python,由于性能问题换成了Go
- C++ 不适合在线 Web 业务
- 早期团队非 Java 背景
- 性能比较好
- 部署简单、学习成本低
- 内部 RPC 和HTTP 框架的推广
二、入门
1、开发环境
1、安装 Golang
直接浏览器输入 go.dev/ 打开 Golang 的官网,然后点击 download 然后按照提示就可以安装Golang 。
打不开的话也可以尝试使用 Golang 中国的镜像 studygolang.com/dl 。
如果访问 github 的速度非常慢的话,可以配置 go mod proxy, 打开 goproxy.cn/ 按照提示操作即可, 配置完成下载第三方包的速度会大大加快。
2、配置集成开发环境
- VSCode:直接从官网下载安装 VSCode,安装完成后在左边扩展里面搜索 Go 插件然后安装
- Goland:可以直接从官网下载,免费试用 30 天。对于在校学生可以申请免费的教育许可证,在校期间都可以直接免费使用。
3、基于云的开发环境
如果有 github 的话,可以很方便地使用 gitpods.IO 的在线编程环境来试用 golang 。
只需要浏览器打开 gitpod.io/#github.com… ,用自己的 github 账号登录,就可以打开课程的示例项目开始编码 。
2、基础语法
2.1、HelloWorld
package main
import "fmt"
func main() {
fmt.Println("hello world")
}
第一行 package main 代表这个文件属于 main 包的一部分,main 包也就是程序的入口包。
第三行导入了标准库里面的 fmt 包。这个包主要是用来往屏幕输入输出字符串、格式化字符串。import 下面是 main 函数,main 函数的话里面调用了 fmt.Println 输出 helloword
要运行这个程序的话,命令行直接输入 go run helloword.go。如果想编译成二进制的话,可以用 go build 来编译。编译完成之后直接 ./helloword 就可以运行。
2.2、变量
go 语言是一门强类型语言,每一个变量都有它自己的变量类型。常见的变量类型包括 字符串、整数、浮点型、布尔型等。
go 语言的字符串是内置类型,可以直接通过加号拼接,也能够直接用等于号去比较两个字符串。
在 go 语言里面,大部分运算符的使用和优先级都和 C 或者 C++ 类似,这里就不再概述。
在go语言里面变量的声明有两种方式,一种是通过 var name string = "" 这种方式来声明变量,声明变量的时候,一般会自动去推导变量的类型。如果有需要,你也可以显示写出变量类型。另一种声明变量的方式是: 使用变量 冒号等于 := 值。
常量的话就是把 var 改成 const,值在一提的是 go 语言里面的常量,它没有确定的类型,会根据使用的上下文来自动确定类型。
package main
import (
"fmt"
"math"
)
func main() {
var a = "initlal"
var b, c = 1, 2
var d = true
var e float64
f := float32(e)
g := a + "foo"
fmt.Println(a, b, c, d, e, f) //initlal 1 2 true 0 0
fmt.Println(g) //initlalfoo
const s string = "constant"
const h = 500000000
const i = 3e20 / h
fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
//constant 500000000 6e+11 -0.28470407323754404 0.7591864109375384
}
2.3、if-else
go语言 里面的 if else 写法和 C 或者 C++ 类似。不同点1是 if 后面没有括号。如果写括号的话,那么在保存的时候编辑器会自动把括号去掉。第二个不同点是 Golang 里面的 if 必须后面接大括号,不能像 C 或者 C++ 一样,直接把 if 里面的语句写在同一行。
package main
import "fmt"
func main() {
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")
}
if num := 9; num < 0 {
fmt.Println(num, "is negative")
} else if num < 10 {
fmt.Println(num, "has 1 digit")
} else {
fmt.Println(num, "has multiple digits")
}
}
2.4、循环
go 里面没有 while 循环、do while 循环,只有唯一的一种 for 循环。最简单的 for 循环就是在 for 后面什么都不写,代表一个死循环。循环途中可以用 break 跳出,也可以使用经典的 C 循环,就是 for i = 0, i < n, i++。这中间三段,任何一段都可以省略。
在循环里面,可以用 break 或者 continue 来跳出或者继续循环
package main
import "fmt"
func main() {
i := 1
for {
fmt.Println("loop")
break
}
for j := 7; j < 9; j++ {
fmt.Println(j)
}
for n := 0; n < 5; n++ {
if n%2 == 0 {
continue
}
fmt.Println(n)
}
for i <= 3 {
fmt.Println(i)
i = i + 1
}
}
2.5、switch
go语言里面的 switch 分支结构,看起来也与 C 或者 C++ 比较类似。同样的在 switch 后面的那个变量名,并不是要括号。一个很大的不同点,在 c++里面,switch case 如果不显示加 break 的话会然后会继续往下跑完所有的 case, 在 go 语言里不需要加 break 。
相比 C 或者 C++ , go 语言里面的 switch 功能更强大。可以使用任意的变量类型,甚至可以用来取代任意的 if else 语句。你可以在 switch 后面不加任何的变量,然后在 case 里面写条件分支。这样代码相比用多个 if else 代码逻辑会更为清晰。
package main
import (
"fmt"
"time"
)
func main() {
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")
}
}
2.6、数组
数组就是一个具有编号且长度固定的元素序列。
对于一个数组,可以很方便地取特定索引的值或者往特定索引处存储值,也能够直接打印一个数组。不过在真实业务代码里面,很少直接使用数组,因为它长度是固定的,用的更多的是切片。
package main
import "fmt"
func main() {
var a [5]int
a[4] = 100
fmt.Println(a[4], 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)
}
未完待续......