GO语言学习笔记一

lvshudao · · 8342 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

GO语言学习笔记一


--------------------------------------------------------------------------

优势:


1.它是系统级别的语言,静态编译,是C系列语言。

2.具有很多内置库,使用起来和Python很类似。

3.语法足够简单,入门学习成本很低,适合我这样从PHP和Python切换过来的人。

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


}




      



有疑问加站长微信联系(非本文作者)

本文来自:开源中国博客

感谢作者:lvshudao

查看原文:GO语言学习笔记一

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

8342 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传