一、golang语言特性
1. 垃圾回收
a、内存自动回收,再也不需要开发人员管理内存 //开发代码中不能存在无引用的变量,不然代码出错
b、开发人员专注业务实现,降低了心智负担
c、只需要new分配内存,不需要释放
2. 天然并发
a、从语言层面支持并发,非常简单
b、goroute,轻量级线程,创建成千上万个goroute成为可能
c、基于CSP(Communicating Sequential Process)模型实现(基于goroute、channel)
并发实例:
不需要担心编码问题,全是utf-8
:= 相当于变量的声明和赋值
在go名称中不建议使用下划线 _
//单行注释
/* */多行注释
go fmt -w filename 格式化代码文件(排版)
package main import( "time" "fmt" ) func test_goroute(a int) { fmt.Println(a) } func main() { for i := 0; i < 100; i++ { go test_goroute(i) } time.Sleep(time.Second) }
3. channel(管道,进程间的通信)
a、管道,类似unix/linux中的pipe
b、多个goroute之间通过channel进行通信
c、支持任何类型
func main() {
pipe := make(chan int,3) //make 分配内存空间
pipe <- 1 //向管道里面扔数值
pipe <- 2
// len(pipe) 管道的长度
t1 =<- pipe //取管道里面的数据
}
管道的传值:
main/main.go
package main import( "go_dev/day1/goroute_example/goroute" "fmt" ) func main() { var pipe chan int pipe = make(chan int, 1) go goroute.Add(100, 300, pipe) sum := <- pipe fmt.Println("sum=", sum) }
goroute/add.go
package goroute func Add(a int, b int, c chan int) { sum := a +b c <- sum }
4. 多返回值
一个函数返回多个值
main/main.go
package main
import(
"go_dev/day1/package_example/calc" //调用其他包,路径根据GOPANTH不用写src,直接从src目录下开始
"fmt"
)
func main() {
sum,_ := calc.Add(100, 300) //接收返回值得一个,_没有值,打印报错
fmt.Println("sum=",sum)
}
calc/Add.go
package calc
func Add(a int, b int) (int,int) {
return a + b,a - b
}
二、包的概念
1、和python一样,把相同功能的代码放到一个目录,称之为包
2、包可以被其他包引用(包内的变量名必须是大写开头,才能被其他包调用)
3、main包是用来生成可执行文件,每个程序只有一个main包
4、包的主要用途是提高代码的可复用性
三、包的编译
建立如下目录结构:
将project添加到GOPATH的环境变量中
然后在PROJECT下编译代码:
go build godev/day1 //因为添加了GOPATH环境变量,能直接找到src文件,所以不用写src,直接编译包含main包的库就是了。
go build -o bin/day1.exe godev/day1 // 将编译文件保存在PROJECT/bin下,并制定编译后的文件名
编译完成后,会生成day1.exe文件,.day1.exe执行