Go 语言是 Google 开发的一种编程语言,它是动态的、强类型的、编译的、并行的,具备垃圾收集的性能。Go 语言能够在不损失应用程序性能的状况下升高代码的复杂性。
Go 语言语法简略,只有 25 个关键词,不须要花工夫去学习和记忆;数据类型包含布尔、数字(整数、浮点、复数)、字符串、切片(数组)、字典映射、管道扭转等。,用起来比拟顺滑。
Go 语言天生具备并发个性,基于 Go 关键字很容易创立协同学来执行一些并发工作。与传统简单的多线程同步计划相比,其基于协同学 - 流水线的 CSP 并发编程模型能够说简略得多。
Go 语言还具备垃圾回收的能力,防止了应用层须要关注内存的调配和开释。要晓得,在 C /C++ 语言中,内存治理是一件很头疼的事件。
Go 语言还提供了绝对残缺的规范库。例如,咱们只须要几行代码来创立和启动 HTTP 服务。
从这篇文章开始,咱们将率领你进入围棋语言的世界。
环境建设
咱们能够抉择下载编译装置的源代码,下载安装包,下载编译好的可执行文件。下载地址是:https://golang.google.cn/dl/.
本地装置是 go1.18.darwin-amd64.tar.gz,
这是一个编译后的可执行文件。您只须要将其解压缩,并将其解压缩到目录$home/documents/go 1.18
。最初,配置以下环境变量:
export go root = $ HOME/Documents/go 1.18
导出门路 =$PATH:$GOROOT/bin
导出 GOPATH=$HOME/Documents/gopath
$GoROOT
是 GO 的装置目录;$PATH
是这样的,咱们能够在任何目录下执行 go 命令;$GOPATH 工作目录,通过 go get 命令下载的依赖包等。放在 $GOPATH 目录中,基于 gomod 治理的依赖文件也会放在这个目录中。
装置实现后,执行 go version 验证装置是否胜利。
一个适合的编辑器是 Go 我的项目开发不可或缺的。举荐应用 Goland,下载地址为:https://www.jetbrains.com/go/.
装置结束后,关上 Goland 新我的项目,新建一个main.go 文件
,编写经典的hello world:
主包装
导入“fmt”func main() {fmt。Println(“你好世界”)
}
Go 语言的所有文件都必须指定所在的包,比方下面的“package main”
,咱们称之为主包。当然,包名也能够用其余名称命名(个别包名与当前目录 / 文件夹名统一),主包中的次要性能是程序的入口性能。
咱们的代码必定会保留在其余文件中。怎么介绍?通过“导入包名”,包中的函数 / 变量只有在导入后能力拜访。如下面的代码所示,fmt 包是 Go 语言底层提供的格式化 /IO 包,Println 函数
将变量打印到规范输入。
数据类型
Go 语言数据类型包含布尔、数字(整数、浮点、复数)、字符串、切片(数组)、字典映射、管道扭转等。各种变量的申明和简略应用如下:
package main
import "fmt"
func main() {
// 变量申明
var a int = 1 //var 申明并初始化变量, 类型 int 能够省略
b := 1 //:= 申明 + 初始化变量
b = 3 //= 只能针对已有变量从新赋值
fmt.Println(a, b)
// 字符串
str1 := "hello"
str2 := "world"
fmt.Println(len(str1), str1 + str2) // 能够 +;len 返回字符串长度
// 数组,容量固定
arr := [5]int{1,2,3,4,5}
arr[1] = 100 // 数组元素拜访
fmt.Println(len(arr), arr) //len 返回数组长度
// 切片,容量能够裁减,相当于动静数组
slice := []int{1,2,3}
slice[1] = 100 // 切片元素拜访
slice = append(slice, 4, 5, 6) //append 主动扩容
fmt.Println(len(slice),cap(slice), slice) //len 返回切片长度,cap 返回切片容量
//map,key-value 构造
score := map[string]int{
"zhangsan":100,
"lisi":99,
"wangwu":98,
}
score["who"] = 90 //map 赋值
s, ok := score["who"] //map 拜访,s 对应 value 值,ok 标识该 key 是否存在(不存在返回空值)delete(score, "lisi") // 删除 map 元素
fmt.Println(s, ok, score)
}
这里没有管道变更示例,这将在第 2 章并发模型中具体介绍。当然,除了 Go 语言提供的这些根本类型,咱们还能够自定义类型,比方接口、构造等。,这也将在前面的章节中介绍。
分支构造
与其余语言相似,Go 语言也反对 if/switch
分支构造和 for 循环构造,如下所示:
package main
import "fmt"
func main() {
//if 分支
condition := true
if condition {fmt.Println("true")
}else{fmt.Println("false")
}
//wsith 分支
expr := "zhangsan"
switch expr {
case "zhangsan":
fmt.Println("zhangsan")
case "lisi":
fmt.Println("lisi")
default: // 没有匹配到,默认执行
fmt.Println("who")
}
//for 循环
for i := 0; i < 100; i ++ {
if i /2 == 0 {fmt.Println("偶数")
}
}
// 无条件循环,死循环
i := 0
for {
i ++
fmt.Println("loop")
if i > 100 { // 检测条件,提前 break 退出循环
break
}
}
}
性能
函数的定义,比方名字、参数、返回值等基本概念,这里就不介绍了。Go 语言和其余语言的区别在于它反对多个返回值 (大多数语言只能返回一个值) 和变量参数(大多数语言实际上都反对)。此外,Go 语言还反对闭包(匿名函数)。例子如下:
package main
import "fmt"
func main() {add, sub := addSub(4, 3)
fmt.Println(add, sub)
sum(1, 2, 3)
nums := []int{1, 2, 3, 4}
sum(nums...) // 切片转可变参数,通过... 实现
// 变量 f 为函数类型
f := func (in string) {fmt.Println(in)
}
f("hello world") // 执行函数
// 申明匿名函数,留神与下面却别,加括号间接执行该匿名函数
func (in string) {fmt.Println(in)
}("hello world")
}
// 返回两个 int 值
func addSub(a, b int) (int, int){return a + b, a - b}
//... 示意参数数目可变
func sum(nums ...int) {
total := 0
//nums 其实是切片类型([]int),for + range 可遍历切片元素
for _, num := range nums {total += num}
fmt.Println(total)
}
协成并发
Go 是一种具备并发个性的语言。基于 Go 关键字,很容易创立一个流程来执行一些并发工作。上面的程序创立 10 个协同并发执行工作,主协同期待每个子协同的执行,而后主动退出:
package main
import (
"fmt"
"sync"
)
func main() {
//WaitGroup 用于协程并发管制
wg := sync.WaitGroup{}
// 启动 10 个协程并发执行工作
for i := 0; i < 10; i ++ {
// 标记工作开始
wg.Add(1)
go func(a int) {fmt.Println(fmt.Sprintf("work %d exec", a))
// 标记工作完结
wg.Done()}(i)
}
// 主协程期待工作完结
wg.Wait()
fmt.Println("main end")
}
重要
作为深刻理解 Go 语言系列文章的第一篇,本文简要介绍了 Go 语言的根本语法,包含根本数据类型、分支构造、函数等基本概念,旨在让大家对 Go 语言 有一个初步的理解。从下一篇文章开始,咱们将开始对 Go 语言的全面摸索。