大佬教程收集整理的这篇文章主要介绍了golang 简介,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
很久以前,有一个IT公司,这公司有个传统,允许员工拥有20%自由时间来开发实验性项目。在2007的某一天,公司的几个大牛,正在用c++开发一些比较繁琐但是核心的工作,主要包括庞大的分布式集群,大牛觉得很闹心,后来c++委员会来他们公司演讲,说c++将要添加大概35种新特性。这几个大牛的其中一个人,名为:Rob Pike,听后心中一万个xxx飘过,“c++特性还不够多吗?简化c++应该更有成就感吧”。于是乎,Rob Pike和其他几个大牛讨论了一下,怎么解决这个问题,过了一会,Rob Pike说要不我们自己搞个语言吧,名字叫“go”,非常简短,容易拼写。其他几位大牛就说好啊,然后他们找了块白板,在上面写下希望能有哪些功能(详见问尾)。接下来的时间里,大牛们开心的讨论设计这门语言的特性,经过漫长的岁月,他们决定,以c语言为原型,以及借鉴其他语言的一些特性,来解放程序员,解放自己,然后在2009年,go语言诞生。
Less can be more 大道至简,小而蕴真 让事情变得复杂很容易,让事情变得简单才难 深刻的工程文化
主要讲讲特有的类型,其他基本类型不做介绍
切片:可以理解为动态数组,类似c++的vector 声明一个slice
@H_301_32@var slice []T 如: var ints []intslice的追加
@H_301_32@ints=append(ints,1) ints=append(ints,2,3,4,5)slice的截取
@H_301_32@newInts1:=ints[2:3] newInts2:=ints[2:] newInts3:=ints[:4]字典:键值对
@H_301_32@var json map[string]string声明一个hen
对象(实现bird接口)
声明一个pig
对象(未实现bird接口,因为pig不会fly)
通道:轻量集队列,传递某种类型的值的通道
@H_301_32@var ch chan int ch=make(chan int,1)往ch写入一个数据
@H_301_32@ch<-8888从ch读取数据
@H_301_32@out:=<-ch特性: channel是有长度的,当channel的缓冲为满时,再往里写入就会阻塞,当channel的缓冲为空时,从channel读就会阻塞
@H_301_32@package main import ( "fmt" "time" ) func main() { ch := make(chan int) fmt.Println("ch len:",len(ch)) go func() { // 往缓冲满的channel里写数据(阻塞) // ch <- 1 // 从缓冲为空的channel里读数据(阻塞) <-ch fmt.Println("I am in minor goroutine") }() fmt.Println("I am in main goroutine") time.Sleep(2 * time.Second) }当长度为0是,就是不带缓冲的channel 长度大于0,就是带缓冲的channel
关键字:go
启动go程 一个普通的函数或方法调用前加上关键字go,即可启动一个goroutine
竞争条件检测 -race
race.go
检测:执行go run -race race.go
结果分析: goroutine6运行到第11行和main goroutine运行到13行的时候触发竞争了。而且goroutine6是在第12行的时候产生的。
包的管理,关键字import
,GOPATH
gopath是一个路径列表,存放go项目工程 GOPATH
文件目录结构
平常项目的目录结构
@H_301_32@├── bin 二进制文件目录 ├── pkg 编译好的库文件目录 └── src 源码目录 ├── main 入口函数目录 └── vendor 当前项目的库目录 └── sheepbao.com └── glog比如上面的项目,我要在main.go
引入glog
包
go的命令工具 test
,用来做测试
go test
只测试函数名被它正确匹配的测试函数 go test -v -run="French|Canal"
栗子: add.go
@H_301_32@package test func addOne(i int) int { return i + 1 }add_test.go
@H_301_32@package test import "testing" func TestAddOne(t *testing.T) { result := addOne(1) if result != 2 { t.Error("1+1!=2") } } @H_301_32@bao@baoMac test$ go test -v . === RUN TestAddOne --- PASS: TestAddOne (0.00s) PASS ok _/Users/bao/program/go/gowork/hello/src/research/test 0.006sgo test -bench=.
内存的分配情况 go test -bench=FuncName -benchmem
栗子: stringsCon.go
stringCon_test.go
@H_301_32@package bench import "testing" var ( s1 = "make it run!" s2 = "make it right!" s3 = "make it fast!" ) func BenchmarkSprintf(b *testing.B) { for i := 0; i < b.N; i++ { Sprintf(s1,s3) } } func BenchmarkAddString(b *testing.B) { for i := 0; i < b.N; i++ { AddString(s1,s3) } }go test -bench=.
如果把上面的// Output: hello,sewise
改为// Output: hello,sewis
则样本测试不能通过
go的命令工具 pprof
,用来性能分析(内存使用,泄露和cpu消耗) go tool pprof
go tool pprof http://localhost:8089/debug/pprof/profile
终端查看: 可视化(原是svg文件,下图为截图):
go tool pprof http://localhost:8089/debug/pprof/heap
终端查看: 可视化(原是svg文件,下图为截图:
go tool pprof --text http://localhost:6060/debug/pprof/heap
http://www.csdn.net/article/2012-07-04/2807113-less-is-exponentially-more
http://www.jianshu.com/p/91e40c3e3acb?hmsr=toutiao.io&utm_medium=toutiao.io&utm_source=toutiao.io
最大牌的当属B和C语言设计者、Unix和Plan 9创始人、1983年图灵奖获得者Ken Thompson,这份名单中还包括了Unix核心成员Rob Pike(go语言之父)、java HotSpot虚拟机和js v8引擎的开发者Robert Griesemer、Memcached作者Brad Fitzpatrick,等等。
以上是大佬教程为你收集整理的golang 简介全部内容,希望文章能够帮你解决golang 简介所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。