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

}

时间: 2024-10-10 02:14:33

GO语言学习笔记一的相关文章

Perl语言学习笔记 9 正则表达式处理文本

1.替换 s/PATTERN/REPLACE/; #返回是否替换成功的布尔值 可以使用捕获变量,如:s/(\w)/$1/ 匹配失败则不做任何处理 2.定界符 对于没有左右之分的定界符,重复三次即可,如:s///.s### 对于有左右之分的定界符,需使用两对,一对包含模式,一对包含替换字符串,这两对可以不一样,如:s{}{}.s[]{}.s<>[] 3.可选修饰符 /g可进行全局替换,替换所有匹配到的字符串,如:s/ / /g /s:使得 . 匹配所有字符 /i:大小写无关 4.绑定操作符 $f

Perl语言学习笔记 6 哈希

1.哈希的键是唯一的,值可以重复! 2.访问哈希元素 $hashname{"$key"};#哈希为大括号,数组为方括号,键为字符串 $family_name{"fred"} = "firstd";#给哈希元素赋值 3.哈希键支持任意表达式 $foo = "na"; $family_name{$foo."me"};#获取$family_name{"name"}对应的值 4.访问整个哈希 %

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它

R语言学习笔记2——绘图

R语言提供了非常强大的图形绘制功能.下面来看一个例子: > dose <- c(20, 30, 40, 45, 60)> drugA <- c(16, 20, 27, 40, 60)> drugB <- c(15, 18, 25, 31, 40) > plot(dose, drugA, type="b") > plot(dose, drugB, type="b") 该例中,我们引入了R语言中第一个绘图函数plot.pl

Go语言学习笔记(一) : 搭建Windows下的Go开发环境

最近突然对Go语言产生了兴趣,主要是因为在使用python的时候遇到了一些不爽的问题,然后发现了Go.Go是Google出的一个动态语言,语法和C++接近,性能也非常的好,而且还支持编译成exe发布,并且不依赖任何虚拟机(其实是打包在exe里面了),这种好语言怎么能够错过?所以便一时兴起,开始学习了起来.由于本人还处于异常小白的阶段,所以文章中可能不免有些错误,欢迎大家各种指正. 安装Go 前往Go语言的官方网站:http://golang.org/, 下载对应平台的安装包.如果是x86的系统可

Perl语言学习笔记 15 智能匹配与give-when结构

1.智能匹配操作符 替代绑定操作符: 在哈希中查找某一个键: 比较两个数组是否完全相同: 查找列表中是否存在某个元素: 智能匹配操作符与顺序无关,~~ 左右元素可以互换 2.智能操作符优先级 3.given语句 相当于c语言的switch语句 4.given可以测试多个条件,在default前用break,否则会导致default一直执行 5.笨拙匹配(正则表达式方式) 6.多个项目的when匹配 可以在语句中间加上其他语句: Perl语言学习笔记 15 智能匹配与give-when结构,布布扣

R语言学习笔记

參考:W.N. Venables, D.M. Smith and the R DCT: Introduction to R -- Notes on R: A Programming Environment for Data Analysis and Graphics,2003. http://bayes.math.montana.edu/Rweb/Rnotes/R.html 前言:关于R 在R的官方教程里是这么给R下注解的:一个数据分析和图形显示的程序设计环境(A system for data

Perl语言学习笔记 day 1

1.Perl Practical Extraction and Report Language:实用摘录与报表语言 2.多行注释 (1) =需要顶格写 = description statement; =cut (2)末尾的description需要顶格写 <<description; print "Hello,world!\n"; description 3.数字: 所有数字在Perl内都以双精度浮点数格式存储; 5**3:5*5*5: 4.字符串: 最短的字符串为空字符

JavaScript--基于对象的脚本语言学习笔记(三)

事件处理器 1.一个数据校验表单的例程 <html> <head> <title>js练习</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <script type="text/javascript"> String.prototype.trim=function(){ r

Perl语言学习笔记 10 其他控制结构

1.unless控制结构 条件为假时执行,与if相反 可以附带else 2.Until控制结构 条件为假时执行,一直执行到条件为真: 3.条件修饰词 效果等同于: 类似的模式: 4.裸块控制结构 { body; body; .... } 有利于为临时变量圈定有效范围 5.elsif子句 6.自增.自减 同c语言 7.for 用法同c语言 8.for与foreach 在perl中,两者等价,优先选择纯正的foreach 9.5种循环块:for.foreach.while.until.裸块 last