狠狠撸

狠狠撸Share a Scribd company logo
淘宝技术部-互动社区
龙犽
我对骋辞语言一点理解
Go语言的背景介绍
? Go语言和谷歌
– Go语言诞生在谷歌
– Go语言是谷歌2007开始开发
– 2009年正式发布成为谷歌的第二个开源编程语言
– Go是谷歌著名的20%时间创造出来的新语言
– 谷歌的AppEngine很早就支持了Go语言的应用
– Go命令,Go关键字
– Go是为解决实际问题而创造的
什么是Go?
? Go是一门 并发支持、垃圾回收 的编译
型系统编程语言,旨在创造一门具有在静态编译
语言的 高性能和动态语言的 高效开
发 之间拥有良好平衡点的一门编程语言。
Go的发展
云计算的编程语言
Facebook的Hack
松本行泓的《代码的未来》
? New(新的)
– 开发效率更高的系统编程语言
? Experimental(实验性的)
– 被业界接受,需要时间
? Concurrent(并发的)
– 语言层面的并发支持
? Garbage-collected(带垃圾回收的)
? System(系统)
? Language
Go语言的特点
? 效率
– 可以媲美C或C++代码的速度
? 简洁
– 语法简洁,关键词大大减少
– 约定胜于配置
? 安全
– 类型安全和内存安全
? 性能
– 协程(goroutine)
– 为多核计算机的性能提升方案
GO语言的HELLO WORLD
Demo
GO和JAVA,我的一点看法
进入主题:
Go语法足够简洁(1)
? 关键字精简(25个)
– break,default,func,interface,select,case,defer,go,map,
– struct,chan,else,goto,package,switch,const,fallthrough,if,
– range,type,continue,for,import,return,var
? Java里还有哪些?
– public,private,protected (Go语言的约定①)
– while,static,final,try,catch,abstract,assert,class,do,enum,extends
,implements,finally,super,this,synaronized,volatile等
Go语法足够简洁(2)
? 可有可无的分号
– 在go语言中,语句结束的分号不在是强制需要的
? 变量声明:
– var Id int; Id = 1
– var Id int = 1
– Id := 1 (相当简洁吧?)
– 还有var () 代码块方式的声明
– 变量的可见性
– i , j = j ,i 能编译吗?
Go语法足够简洁(3)
? 常量和枚举类型
– 常量的可见性
– 没有声明则会默认采用前面的值
– 神奇的iota
? 条件表达式
– if语句的条件的括号也不需要了
– switch默认只会执行一个代码块,如果需要继续执行,需要
显示声明fallthrough
Go语法足够简洁(4)
? 一个for = Java语言的for,while,do
– for x<3 { }
– for { if XXXXX { break }}
– for i:=0; i<10;i++ {}
? 多函数值返回
– func numDiv(a int, b int) (int, error)
– Java里如何做呢?
? Go支持匿名函数和闭包
Go语法足够简洁(5)
? for…range
– 轻松实现对数组,切片,map和chan的数据的迭代
– 集合方法多返回值的特点,可以用来判断轮询的成功
或失败
数组和切片
? Go的数组和Java数组是相似的
– 不同长度的数组不能比较: int[2], int[3]
? 什么是切片
– 切片的长度len()
– 切片的容量cap()
– 切片的底层是数组
– 不同的slice可以指向同一个数组
指针,值传递,引用传递
? 指针
– .操作,没有-> 操作符
– &和*
? go方法入参默认是值传递
– 方法内获得的数据是入参的一个拷贝
– 所以任何对这个拷贝的修改不会影响到函数调用处的原始值
– 如果不希望修改入参,使用值传递
– 引用传递效率更高
– slice,map,chan默认是引用传递
Go的错误处理
? 不用try,catch代码块
? error接口,多函数值的返回
? defer的使用 (Java7中类似的语法改进)
– 按声明的先后的反顺序执行
– 即使有严重错误也会执行
? panic和recover
– panic可以在任何地方声明,recover则必须在defer代码快中处理
– 通常情况下,只需要使用error接口来处理错误
Go如何快捷的实现并发?
? Go的协程
? 语言层次上对并发的支持,轻轻松松可以实现单CPU上万的协
程
? go关键字
? 通过通信来共享内存
– chan
– 也支持共享内存的方式: sync包
? chan基础
– 类型相关的
– 双向,单向和带缓存的通道
Go如何快捷的实现并发?
? select和switch
– 他们只是语法上看着相似
– select只能使用在chan上
– 带default语句块的区别?
Go如何面向对象?
? Go没有对象,没有class关键字
? 用结构struct来实现类似对象的封装
? 不支持继承
– 只支持组合,没有Java那样复杂的类关系图
? 实现接口不用显示声明
– 只需要结构B实现了接口C的所有方法
? 空接口interface{}
– 相当于Java的万物之源Object
? 任何类型都可以增加方法
Go的命令行工具
? 只有一个go
– 跨平台的编译支持(6g,8g,5g,6l,8l,5l)
– 格式化代码 go fmt
– 编译,运行 go run, go build, go install
– 测试 go test
– 文档 go doc
– 远程包和库 go get
? 支持Git(Github)和Mercurial (Google Code)
其他(1)
? 对无效引用的强制性检查
– 没有使用的包引入
– 没有使用的变量声明
? 类型安全
– 强制类型安全检查
– 强制的类型转换
– 类型不同的数据不能比较
? make和new
– 智能通过make来创建slice, map和chan
– new返回的是一个指针
其他(2)
? ++和--
– 是语句,不是表达式
? Go语言的反射和类型断言
– reflect 包
? Go语言已经提供了对压缩,加密解密,图形图像,
国际化,网络,I/O,编码等完整的支持
总结
? Go是一门刚开始发展的语言,Java却已经足够的成熟,
庞大的开源类库
? Go是为了高并发而设计的,支持服务器端应用的开发,
目前是没有UI开发的包支持
? 语法上Go和Java,C++有很多的相似,所以学习的成
本很低
? Go是系统语言,不需要虚拟机,她对C和C++的改进
参考资料
? 网站:
– Go语言官方网站(http://golang.org)
– 网易云课堂中的Go语言课程
– http://play.golang.org
? 书籍:
? 开源项目
谢谢

More Related Content

我对骋辞语言一点理解