Golang 学习总结及归纳

--------------------------------------------------------------------------
优势:

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的开源项目还不够多。我觉得一个语言的发展不仅仅是语言本身出色,还要有大公司推动或者好的项目推动。
--------------------------------------------------------------------------
为什么Go被称为互联网时代的C呢

我认为是Go在语言级别上支持了并发,通过简单的关键字go就可以充分利用多核,这对于硬件不断发展的时代,这么简
单就可以充分利用硬件的多核,这是多么重要的一个特性啊!但是相比C而言,Go还缺少一些高质量的第三方包,例如
OpenGL等,所以Go内部也支持用cgo直接调用C语言编写的代码。
--------------------------------------------------------------------------
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文件开始处即可

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
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值