golang语言的特性
垃圾回收
(1)内存自动回收,再也不需要开发人员管理内存
(2)开发人员专注业务的实现,降低了心智的负担
(3)只需要new分配内存,不需要释放
天然并发
(1)从语言层面支持并发,非常简单
(2)goroute,轻量级线程,即协程,可以创建成千上万个goroute,不会像线程一样创建过多而造成资源的浪费,效率的低下。
(3)基于CSP模型实现
并发的支持很简单,只需要调用方法的时候加上go关键字就行
eg:
func main(){
go fmt.Println("hello")
}
- channel
(1)管道,类似于unix/linux中的pipe
(2)多个goroute之间是通过channel进行通信的
(3)支持任何的类型
func main(){
pipe := make(chan int, 3)
pipe <- 1
pipe <- 2
}
- 一个函数可以返回多个值
(1)一个函数可以返回多个值,如同python一样
func calc(a int, b int) (int, int){
sum := a+b
avg := (a+b)/2
return sum, avg
}
包的概念
(1)和python一样,把相同的代码放到一个目录,称之为包
(2)包可以被其他的包引用
(3)main包是用来执行可执行文件的,每个程序只有一个main包,这个不同于java,java是每一个类下都可以有一个main,而go是每一个包里面只有一个main
(4)包的主要途径是提高代码的可复用性
eg. 在main包中引入calc包中的代码:
package calc
func Add(a int, b int) int {
return a + b
}
package main
import (
"fmt"
"calc"
)
func main(){
sum := calc.Add(3, 5)
fmt.Println("hello world: ", sum)
}
注意事项
这里有几点需要关注一下,后续会进行更详细的讲解:
goroute可以无限制,而java中的线程是必须控制数量的
goroute依赖于主线程,与java不同,go中是主线程结束,goroute就结束了
csp = goroute + channel
一个包的下面只能有一个main函数,而java是一个类下面就可以有一个main
pipe的定义: pipe := make(chan int, 3)
(1)make 如同new,分配空间
(2)chan表示一个管道,其管道也需要指明类型 如:chan int
(3)最后的参数表示该管道的大小
go中的管道,当存放的数据大于了管道长度,则会发生阻塞,当管道中没有数据的时候,从管道中取数据也会阻塞
pipe的管道是类似队列,存放的顺序是先进先出。
首字母变量大写,权限相当于public可以在别的包中对其进行访问;
go中会自动识别死锁,若出现死锁,go会报错,不会继续执行
当我们的函数返回值是多个的时候,但是我们只需要一个返回值,在go中定义的变量没有被使用是会报错的,所以这时候我们应该使用_(下划线)来对返回值进行忽略,如 a, _ = sum(a,b)
go的编码永远都是UTF-8
go编译完成后永远只有一个可执行文件,不像java还会将其他的依赖变为class文件
go会默认在环境变量配置的G O P A T H 下 面 找 , 默 认 会 在 {GOPATH}下面找,默认会在GOPATH下面找,默认会在{GOPATH} 下的src目录下找,所以导入的时候,根据自己的环境变量导入其全路径。
智一面王老师说运维推荐初级Golang开发工程师在线评测:http://www.gtalent.cn/exam/interview/FM2N7xj54dQBPfUE
王老师说运维之go语言菜鸟入门:http://www.codeforest.cn/course/474