初始 golang, 语言之美之简洁之高效, 天生具有高并发等特性. 本文来自蔡欣圻, 邵聪聪, 对 go 语言的分析很到位全面, 在这里分享出来给 go 开发者, 希望能让你有一个更深刻的认知.
目录
Golang 的哲学
Golang vs Java
风靡世界?!
我们的先行实践
Golang 的哲学
1,go 背景介绍: go 语言是 google 2009 年发布的第二版开源编程语言, 针对多处理器系统应用程序的编程进行了优化, 使用 Go 编译的程序可以媲美 C 或 C++ 代码的速度, 而且更加安全, 支持并行进程.
2,go 是面向接口, 组合编程;
3, 正交性: 语言设计的正交性, 保证语言的稳定性和简单, go 很好的遵循正交规律, 如: goroutine 接口, 组合等;
4, 少即是多: 有且仅有一种方法把事情做好做对, 保持简单行的方法是 go 语言特性紧提供一种方法, 减少重复, 冗余, 把事情做到极致是 go 的原则;
5, 并发语言层面支持: 并发更好利用多核没有更强的表现力来模拟真实世界;
6, 开放性: 开源, 语言的实现对程序员不是个黑盒子, 任何想了解语言实现都可以参与.
7, 强大的作者阵容: C 语言之父, Unix 系统之父, Utf8 和 JavaScript V8 之父等等
- package bench
- import (
- "testing"
- )
- // 测试 Xor 性能
- func BenchmarkXor(b *testing.B) {
- a := 0
- for i := 0; i < b.N; i++ {
- final := 0
- for i := 0; i < 1000; i++ {
- final ^= i
- }
- a = final
- }
- _ = a
- }
- BenchmarkXor-8 20000000 310 ns/op 0 B/op 0 allocs/op
- PASS
- ok go_test/bench 6.537s
- mian.go // 启动海量子线程执行计算任务
- package main
- import (
- "log"
- "sync"
- "sync/atomic"
- "time"
- )
- var total int32 = 0
- func main() {
- // 控制子线程的任务执行, 等同于 Map/Reduce 处理
- wg := &sync.WaitGroup{}
- // 统计运行时间
- ts := time.Now()
- // 启动 100 万个线程, 每个线程执行 100 次加 1 的任务, 这里使用了锁, 防止脏数据
- for i := 0; i < 1000000; i++ {
- // go 标记的函数, 自动在一个新的线程中去执行
- go func() {
- // 控制器的执行任务 + 1
- wg.Add(1)
- // 子线程结束时, 控制器的执行任务完成
- defer wg.Done()
- for i := 0; i < 100; i++ {
- atomic.AddInt32(&total, 1)
- }
- }()
- }
- // 这里主线程休眠一小短时间, 防止子线程的任务控制 wg.Add(1)还没有触发, 主线程就执行完毕
- time.Sleep(1 * time.Millisecond)
- // 等待子线程的任务完成
- wg.Wait()
- // 输出最终运行时间
- log.Printf("启动 100 万个线程并执行计算任务完成, 总计耗时:%v(毫秒)\n", time.Now().Sub(ts).Nanoseconds()/1000000)
- // 输出最终结果
- log.Println("最终计算结果为", total)
- }
来源: https://juejin.im/post/5bf50600e51d457dd85460d8