go语言特性
1、垃圾回收
a、内存自动回收,再也不需要开发人员管理内存
b、开发人员专注业务实现,降低了心智负担
c、只需要new分配内存,不需要释放
2、天然并发
a、从语言层面支持并发,非常简单
b、goroute,轻量级线程,创建成千上万个goroute成为可能
c、基于CSP(Communicating Sequential Process)模型实现
高并发示例
package main import ( "fmt" ) func test_print(a int) { fmt.Println(a) } func main() { for i := 0; i < 100; i++ { go test_print(i) } }
3、channel
a、管道,类似unix/linux中的pipe
b、多个goroute之间通过channel进行通信
c、支持任何类型
例一
func main() { var pipe chan int pipe = make(chan int, 3) pipe <- 1 pipe <- 2 }
例二
package main import "fmt" var pipe chan int //声明变量 func add(a int, b int) int { sum := a + b pipe <- sum return sum } func main() { pipe = make(chan int, 1) //创建管道 go add(2,3) sum :=<- pipe //等待pipe里有数据才继续执行 fmt.Println("sum =",sum) }
例三
package main import "fmt" func add(a int, b int, c chan int) int { sum := a + b c <- sum return sum } func main() { var pipe chan int pipe = make(chan int, 1) //创建管道 go add(2,3, pipe) sum :=<- pipe //等待pipe里有数据才继续执行 fmt.Println("sum =",sum) }
注意:
var pipe chan int pipe = make(chan int, 3)
上面的代码跟下面的代码意思是一样的
pipe := make(chan int, 3)
4、多返回值
a、一个函数返回多个值
package main import "fmt" func calc(a int, b int) (int,int) { c := a + b d := (a + b)/2 return c, d } func main() { sum, _ := calc(2,4) fmt.Println("sum=",sum) }
包的概念
1、和python一样,把相同功能的代码放到一个目录,称之为包
2、包可以被其它包引用
3、main包是用来生成可执行文件,每个程序只有一个main包
4、包的主要用途是提高代码的可复用性
目录组织结构
一、文件名&关键字&标识符
1、所有go源码以.go结尾
2、标识符以字母或下划线开头,大小写敏感
3、_是特殊标识符,用来忽略结果
4、保留关键字
二、go程序的基本结构
package main import "fmt" func main() { fmt.Println("hello") }
1、任何一个代码文件隶属于一个包
2、import关键字,引用其他包
3、golang可执行程序,package main,并且有且只有一个main入口函数
4、包中函数调用:
a.用一个包中函数,直接调用
b.不同包中函数,通过包名+点+函数名进行调用
5、包访问控制规则:
a.大写意味着这个函数/变量是可导出的
b.小写意味着这个函数/变量是私有的,
包外部不能访问