一、golang语言的特性
1.垃圾回收
- a.内存自动回收,再也不需要开发人员管理内存
- b.开发人员专注业务实现,降低了心智负担
- c.只需要new分配内存,不需要释放
2.天然并发
- a.从语言层面支持并发,非常简单
- b.goroute,轻量级线程,创建成千上万个goroute成为可能
- c.基于CSP(Commnuncating Sequential Process)模型并发
func main() { go fmt.Println(“hello") }
3.channel
- a.管道,类似unix/linux中的pipe
- b.多个goroute之间通过channel进行通信
- c.支持任何类型
func test_pipe() { pipe := make(chan int, 3) pipe <- 1 pipe <- 2 pipe <- 3 sum = <-pipe // pipe <- 4 fmt.Println("sum=", sum) fmt.Println(len(pipe)) }
4.多返回值
a.一个函数返回多个值
package main func clac(a int, b int) (int, int) { // 多返回值 c := a + b d := (a + b) / 2 return c, d }
二、开发环境搭建
1. Go 语言支持以下系统:
-
Linux
-
FreeBSD
-
Mac OS X(也称为 Darwin)
-
Windows
安装包下载地址为:https://golang.org/dl/。
如果打不开可以使用这个地址:https://golang.google.cn/dl/。
根据操作系统选择对应的安装包,点击安装包进行安装(linux直接解压)
设置环境变量
2.配置环境变量
linux
export GOROOT=$PATH:/path/to/go/ export PATH=$PATH:$GOROOT/bin/ export GOPATH=/home/user/project/go
windows安装的如果是msi安装文件,Go语言的环境变量会自动设置好。如果后面的测试无法通过,可以重新设置环境变量。
第一个golang程序
hello world, 在新建hello.go
package main import "fmt" func main() { fmt.Println("hello world") }
在终端输入go run hello.go,如何成功打印hello world则证明配置成功
IDE搭建(vscode)
新建项目目录结构
三、包的概念
- a.和python一样,把相同功能的代码放到一个目录,称之为包
- b.包可以被其他包引用
- c.main包是用来生成可执行文件,每个程序只有一个main包
- d.包的主要用途是提高代码的可复用性
实例: 代码目录
add.go
package calc func Add(a int, b int) int { return a + b }
sub.go
package calc func Sub(a int, b int) int { return a - b }
main.go
package main import ( "fmt" "go_dev/day1/package_example/calc" ) func main() { sum := calc.Add(100, 300) sub := calc.Sub(100, 300) fmt.Println("sum=", sum) fmt.Println("sub=", sub) } // go build -o bin/calc.exe go_dev/day1/package_example/main
四、goroute
1. goroute实现并发
goroute.go
package main import "fmt" func test_goroute(a int) { fmt.Println(a) }
main.go
package main import "time" func main() { for i := 0; i < 100; i++ { go test_goroute(i) } time.Sleep(3 * time.Second) } // go build go_dev/day1/goroute
2. goroute管道通信
add.go
package goroute func Add(a int, b int, c chan int) { sum := a + b c <- sum }
main.go
package main import ( "fmt" "go_dev/day1/goroute_example/goroute" ) func main() { var pipe chan int pipe = make(chan int, 1) go goroute.Add(100, 300, pipe) sum := <-pipe fmt.Println("sum=", sum)