如何安装网站模板,网站外链多的危害,长春做网站建设的公司,深圳高端别墅设计公司by sheepbao 主要大概介绍go语言的历史和特性#xff0c;简单的入门。 来历 很久以前#xff0c;有一个IT公司#xff0c;这公司有个传统#xff0c;允许员工拥有20%自由时间来开发实验性项目。在2007的某一天#xff0c;公司的几个大牛#xff0c;正在用c开发一些比较繁…by sheepbao 主要大概介绍go语言的历史和特性简单的入门。 来历 很久以前有一个IT公司这公司有个传统允许员工拥有20%自由时间来开发实验性项目。在2007的某一天公司的几个大牛正在用c开发一些比较繁琐但是核心的工作主要包括庞大的分布式集群大牛觉得很闹心后来c委员会来他们公司演讲说c将要添加大概35种新特性。这几个大牛的其中一个人名为Rob Pike听后心中一万个xxx飘过“c特性还不够多吗简化c应该更有成就感吧”。于是乎Rob Pike和其他几个大牛讨论了一下怎么解决这个问题过了一会Rob Pike说要不我们自己搞个语言吧名字叫“go”非常简短容易拼写。其他几位大牛就说好啊然后他们找了块白板在上面写下希望能有哪些功能详见文尾。接下来的时间里大牛们开心的讨论设计这门语言的特性经过漫长的岁月他们决定以c语言为原型以及借鉴其他语言的一些特性来解放程序员解放自己然后在2009年go语言诞生。 思想 Less can be more 大道至简,小而蕴真 让事情变得复杂很容易让事情变得简单才难 深刻的工程文化 优点 自带gc。静态编译编译好后扔服务器直接运行。简单的思想没有继承多态类等。丰富的库和详细的开发文档。语法层支持并发和拥有同步并发的channel类型使并发开发变得非常方便。简洁的语法提高开发效率同时提高代码的阅读性和可维护性。超级简单的交叉编译仅需更改环境变量。花了我两天时间编译一个imagemagick到arm平台内含完善、全面的软件工程工具。Go语言自带的命令和工具相当地强大。通过它们我们可以很轻松地完成Go语言程序的获取、编译、测试、安装、运行、运行分析等一系列工作这几乎涉及了开发和维护一个软件的所有环节。hello package mainfunc main() {println(hello, sewise)
} type 主要讲讲特有的类型其他基本类型不做介绍 slice 切片可以理解为动态数组类似c的vector 声明一个slice var slice []T// 如var ints []int slice的追加 ints append(ints, 1)
ints append(ints, 2, 3, 4, 5) slice的截取 newInts1 : ints[2:3]
newInts2 : ints[2:]
newInts3 : ints[:4] map 字典键值对 var json map[string]string interface 接口方法的集合,是一种合约 栗子 声明一个bird接口 var bird interface {fly()
} 声明一个hen对象(实现bird接口) type hen struct {weight inthasFeather bool
}func (h hen) fly() {fmt.Println(iI can fly)
}func (h hen) eat() {h.weightfmt.Println(yes, I can eat)
} 声明一个 pig 对象未实现 bird 接口因为 pig 不会 fly type pig struct {age intweignt inthasFeather bool
}func (p pig) run() {fmt.Println(I can run)
}func (p pig) eat() {p.weight 100fmt.Println(Yes, I can eat so much)
}func (p pig)sleep(){fmt.Println(I slept all my life)
}// pig cant flychannel 通道轻量集队列传递某种类型的值的通道 var ch chan int
ch make(chan int, 1) 往ch写入一个数据 ch- 8888 从ch读取数据 out : -ch 特性 channel是有长度的当channel的缓冲为满时再往里写入就会阻塞当channel的缓冲为空时从channel读就会阻塞 package mainimport (fmttime
)func main() {ch : make(chan int)fmt.Println(ch len:, len(ch))go func() {// 往缓冲满的channel里写数据阻塞// ch - 1// 从缓冲为空的channel里读数据阻塞-chfmt.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 go func() {fmt.Println(start func)time.Sleep(120*time.Second)
}() 竞争条件检测 -race race.go package mainimport (fmttime
)func main() {a : 1go func() {a 2}()a 3fmt.Println(a is , a)time.Sleep(2 * time.Second)
} 检测执行go run -race race.go a is 3WARNING: DATA RACE
Write at 0x00c420072188 by goroutine 6:main.main.func1()/Users/bao/program/go/gowork/hello/src/research/race.go:11 0x3bPrevious write at 0x00c420072188 by main goroutine:main.main()/Users/bao/program/go/gowork/hello/src/research/race.go:13 0x9fGoroutine 6 (running) created at:main.main()/Users/bao/program/go/gowork/hello/src/research/race.go:12 0x8eFound 1 data race(s) 结果分析 goroutine6运行到第11行和main goroutine运行到13行的时候触发竞争了。而且goroutine6是在第12行的时候产生的。 package 包的管理关键字importGOPATH gopath gopath是一个路径列表存放go项目工程 GOPATH文件目录结构 ├── bin 二进制文件目录
├── pkg 编译好的库文件目录
└── src 源码目录 平常项目的目录结构 ├── bin 二进制文件目录
├── pkg 编译好的库文件目录
└── src 源码目录├── main 入口函数目录└── vendor 当前项目的库目录└── sheepbao.com└── glog import 比如上面的项目我要在main.go引入glog包 package main// 引入glog包
import sheepbao.com/glogfunc main() {glog.Println(test)
} go的工程工具简介 test go的命令工具 test,用来做测试 单元测试 go test 只测试函数名被它正确匹配的测试函数 go test -v -runFrench|Canal 栗子 add.go package testfunc addOne(i int) int {return i 1
} add_test.go package testimport testingfunc TestAddOne(t *testing.T) {result : addOne(1)if result ! 2 {t.Error(11!2)}
} baobaoMac test$ go test -v .RUN TestAddOne
--- PASS: TestAddOne (0.00s)
PASS
ok _/Users/bao/program/go/gowork/hello/src/research/test 0.006s 基准测试 go test -bench. 内存的分配情况 go test -benchFuncName -benchmem 栗子 stringsCon.go package benchimport (fmt
)func Sprintf(s1, s2, s3 string) string {return fmt.Sprintf(%s%s%s, s1, s2, s3)
}func AddString(s1, s2, s3 string) string {return s1 s2 s3
}stringCon_test.go package benchimport testingvar (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, s2, s3)}
}func BenchmarkAddString(b *testing.B) {for i : 0; i b.N; i {AddString(s1, s2, s3)}
}go test -bench. baobaoMac bench$ go test -bench.
testing: warning: no tests to run
BenchmarkSprintf-4 5000000 349 ns/op
BenchmarkAddString-4 20000000 61.7 ns/op
PASS
ok _/Users/bao/program/go/gowork/hello/src/research/bench 3.414s 样本测试 package etimport (fmt
)func ExampleHello() {fmt.Println(hello, sewise)// Output: hello, sewise
} baobaoMac example$ go test -v .RUN ExampleHello
--- PASS: ExampleHello (0.00s)
PASS
ok _/Users/bao/program/go/gowork/hello/src/research/example 0.006s 如果把上面的// Output: hello, sewise改为// Output: hello, sewis 则样本测试不能通过 baobaoMac example$ go test -v .RUN ExampleHello
--- FAIL: ExampleHello (0.00s)
got:
hello, sewise
want:
hello, sewis
FAIL
exit status 1
FAIL _/Users/bao/program/go/gowork/hello/src/research/example 0.006s pprof go的命令工具 pprof用来性能分析内存使用泄露和cpu消耗 go tool pprof 查看cpu使用 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 go命令教程 资料 http://www.csdn.net/article/2012-07-04/2807113-less-is-exponentially-more http://www.jianshu.com/p/91e40c3e3acb?hmsrtoutiao.ioutm_mediumtoutiao.ioutm_sourcetoutiao.io http://smallsoho.com/2016/11/20/Go简明教程.html?hmsrtoutiao.ioutm_mediumtoutiao.ioutm_sourcetoutiao.io 大牛真身 最大牌的当属B和C语言设计者、Unix和Plan 9创始人、1983年图灵奖获得者Ken Thompson这份名单中还包括了Unix核心成员Rob Pikego语言之父、java HotSpot虚拟机和js v8引擎的开发者Robert Griesemer、Memcached作者Brad Fitzpatrick等等。 功能 规范的语法不需要符号表来解析垃圾回收独有无头文件明确的依赖无循环依赖常量只能是数字int和int32是两种类型字母大小写设置可见性letter case sets visibility任何类型type都有方法不是类型没有子类型继承不是子类包级别初始化以及明确的初始化顺序文件被编译到一个包里包package-level globals presented in any order没有数值类型转换常量起辅助作用接口隐式实现没有“implement”声明嵌入不会提升到超类方法按照函数声明没有特别的位置要求方法即函数接口只有方法没有数据方法通过名字匹配而非类型没有构造函数和析构函数postincrement如i是状态不是表达式没有preincrement(i)和predecrement赋值不是表达式明确赋值和函数调用中的计算顺序没有“sequence point”没有指针运算内存一直以零值初始化局部变量取值合法方法中没有“this”分段的堆栈没有静态和其它类型的注释没有模板内建string、slice和map数组边界检查