GO语言学习笔记一html
--------------------------------------------------------------------------c++
优点:数据库
1.它是系统级别的语言,静态编译,是C系列语言。浏览器
2.具备不少内置库,使用起来和Python很相似。缓存
3.语法足够简单,入门学习成本很低,适合我这样从PHP和Python切换过来的人。bash
4.速度快,就拿简单的页面来讲,我用PHP开发并发可以达到500很好了,可是用Go轻松就到上万,这是没法比拟的性能服务器
提高,并且用Go开发的效率和PHP差很少。并发
5.出自Google之手,并且有一帮牛人在维护,基于BSD开源,社区活跃。框架
--------------------------------------------------------------------------分布式
缺点:
1.有些库不成熟,例如图像处理。
2.cgo在Window系统下面编译很麻烦,就拿SQLite的数据库驱动来讲,在Window下面编译就会遇到很大的麻烦。
3.runtime还不够成熟,GC还不是很好,不过据说Go 1.1版本会有比较大的性能提高。
4.Go的开源项目还不够多。我以为一个语言的发展不只仅是语言自己出色,还要有大公司推进或者好的项目推进。
--------------------------------------------------------------------------
开源项目
开源项目给我不少自信,举几个开源系统:
vitess(YouTube的数据库proxy系统)、
nsq(bitly的一个实时信息处理系统)、
skynet(轻量级的分布式服务框架)、
七牛公司所有用Go开发、
360开发的类iMessage应用,支持上千万用户,同时单台服务器长连80w,
这些系统都是他们线上跑的,这给我更大的信心可以用Go来开发高性能,高稳定的应用。
--------------------------------------------------------------------------
为何Go被称为互联网时代的C呢
我认为是Go在语言级别上支持了并发,经过简单的关键字go就能够充分利用多核,这对于硬件不断发展的时代,这么简
单就能够充分利用硬件的多核,这是多么重要的一个特性啊!可是相比C而言,Go还缺乏一些高质量的第三方包,例如
OpenGL等,因此Go内部也支持用cgo直接调用C语言编写的代码。
同时我还开发了两个开源的项目:
beego:一个模仿Python的tornado系统开发的Go开发框架,如今开发的几个系统都是基于该框架开发。
beedb: 一个Go语言的ORM库,能够像操做struct同样操做数据库数据。目前咱们内部的API接口我就是采用了这个ORM
开发的。
1.书籍《go语言程序设计》
1.1 go语言是一门静态编译型的语言。编译速度很是快,明显快于c,c++。
go语言的官方编译器是gc。
查看官方文档: 运行指令 godoc -http=:8000 在浏览器中打开http://localhost:8000就能够查看go语言官方文
档。
go语言支持在程序中以cgo工具的形式调用外部的c语言代码。
1.2 编辑
go语言关键字和操做符都使用ASCII编码字符,可是GO语言中的标识符可使任一Unicode编码字符串,因此go语言
开发者能够再代码中自由地使用它们的母语。
编译
go语言的编译速度超快,因此go语言能够做为类UNIX系统上的#!脚本使用。将#!/usr/bin/env gonow 或者
#!/usr/bin/env gorun加到main()所在的.go文件开始处便可
。
示例
www.qtrac.eu/gobook.html 获得本书全部的源码。
环境变量设置
在.bashrc文件中添加如下行:
export GOROOT=$HOME/opt/go
export PAHT=$PATH:$GOROOT/bin
http://www.qtrac.eu/gobook-1.0.zip
gofmt -w src 能够格式化整个项目
如何查看相应的package文档?
若是是 builtin包,那么执行godoc builtin
若是是 http 包, 那么执行godoc net/http
若是查看某一个包里面的函数,则执行godoc fmt Printf,也能够查看相应的代码,执行 godoc -src fmt Printf
-----------------------------------
UTF-8 天生支持utf-8字符串和标示符,由于utf-8的发明者也是go语言的发明者。
并发
goroutine 是go语言并行设计的核心,goroutine说到底就是线程,可是它比线程更小,十几个goroutine可能
体如今底层就是五六个线程,go语言内部帮你实现了这些goroutine之间的内存共享。
执行goroutine只需极小的栈内存(4--5k)。
默认状况下,调度器仅使用单线程。想要发挥多核处理器的并行,须要在咱们的程序中显示调用
runtime.GOMAXPROCS(n) 告知调度器同时使用多个线程。
channel
1.无缓冲的 channel
默认状况下,channel接收和发送数据都是阻塞的,除非另外一端已经准备好,这样就使得goroutine同步变得更加简
单,而不须要显式的lock。
所谓阻塞,也就说若是读取,它就会被阻塞,直到有数据接收;任何发送也会被阻塞,直到读数据被读出。
无缓冲的channel是在多个goroutine之间同步最棒的工具。
2.有缓冲的channel
ch := make(chan bool ,4)建立了一个能够存储4个元素的bool型channel 。在这个channel中,前4个元素能够无
阻塞的写入。当写入第5个元素时,代码将会阻塞,直到其余goroutine从channel中读取一些元素,腾出空间。
range 和close
func Test(){
c := make(chan int, 10)
go fibonacci(cap(c) ,c)
for i := range c { //使用range操做缓存类型的channel
fmt.Println(i)
}
}
func fibonacci(n int,c chan int){
x,y := 1,1
for i := 0 ;i < n ;i++ {
c <- x
x,y = y,x+y
}
close(c) //在生产者的地方关闭channel,而不是在消费的地方去关闭它,这样容易起panic。
}
select
func Test(){
c := make(chan int)
quit := make(chan int)
go func(){
for i :=0 ;i<10;i++{
fmt.Println(<-c)
}
quit <- 0
}()
fibonacci(c,quit)
}
func fibonacci(c,quit chan int){
x,y := 1,1
for {
select {//*select 默认是阻塞的,只要当监听的channel中发送或者接收能够进行时,才会运行。
case c <-x ://*当多个channel都准备好的时候,select是随机选择一个执行的。
x,y = y,x+y
case <-quit:
fmt.Println("quit")
return
default:
fmt.Println("do some thing ");
}
}
}
超时
func Test(){
c := make(chan int)
o := make(chan bool)
go func(){
for {
select {
case v := <-c :
fmt.Println(v)
case <- time.After(5 * time.Second) :
fmt.Println("timeout")
o <- true
break
}
}
}()
<- o
}