go语言是一种静态类型、编译型、高并发型语言,相比c++它语法简洁,相比java它是一门高效的语言,Go语言也编译型的语言,执行效率更高。
go现在依赖管理一般使用go module,每个项目都有一个go.mod文件,定义了项目的依赖关系和版本信息。go mod命令可以自动下载、更新和管理依赖包。
常用的命令有
初始化模块:在项目根目录下运行以下命令,初始化一个新的Go模块:
go mod init <module-name>
添加依赖:在代码中导入依赖包,然后运行以下命令自动下载依赖:
go mod tidy
更新依赖: 运行以下命令更新依赖包到最新版本:
go get -u <package-name>
查看依赖: 运行以下命令查看项目的依赖关系:
go list -m all
go语言的语法和c/c++/java一个显著的不同之处是声明变量/函数的时候,类型写在后面。我读了一篇讲C语言前置声明和go语言后置声明比较的博客,它提到如果在使用多重指针,函数指针等很冗长的类型时,后置类型声明只需要从左到右直接读而不会带来阅读的困难。
Go语言在声明变量的时会自动对变量对应的内存区域进行初始化操作。每个变量会被初始化成其类型的默认值,例如: 整型和浮点型变量的默认值为0。 字符串变量的默认值为空字符串。 布尔型变量默认为false。 切片、函数、指针变量的默认为nil。
每个Go程序都是由包(package)组成的。程序从main包开始运行。
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
Go语言使用var关键字声明变量。使用const关键字声明常量。
Go语言支持以下基本数据类型:
布尔型: bool
数字类型: int, float32, float64, complex64, complex128
字符串类型: string
派生类型: 指针、数组、结构体、联合、函数、切片、接口、Map、通道
Go语言内置了强大的并发支持,使用goroutine和channel实现。
Goroutine
Goroutine是Go语言中的轻量级线程。通过在函数调用前加上go关键字,可以启动一个新的Goroutine。
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 5; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("world")
say("hello")
}
Channel
Channel用于在Goroutine之间传递数据。Channel是类型化的,可以传递任何类型的数据。
使用make函数创建Channel:
ch := make(chan int)
使用<-操作符发送和接收数据,带缓冲的Channel可以在没有接收者的情况下存储一定数量的值,使用close函数关闭Channel
关闭Channel后,不能再向其发送数据,但仍然可以接收数据,直到Channel中的数据被全部接收。
可以使用range关键字遍历Channel中的数据
Go语言支持单向Channel,即只能发送或只能接收数据的Channel。
- 只发送Channel:
chan<- T - 只接收Channel:
<-chan T
可以使用select处理多个Channel,select语句用于在多个Channel操作中选择一个可执行的操作。如果多个Channel都准备好,select会随机选择一个执行。