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.小写意味着这个函数/变量是私有的,
包外部不能访问