Effection Go
Introduction:
新语言, 新思维
Formatting
Indentation: 默认tab
Line Length: 无限制, 会自动换行
Parentheses: 圆括号, 无限制, 但会自动去掉if, switch, for控制结构中的圆括号.
使用gofmt命令自动格式源码.
Commentary
多行: /**/
单行: //
使用godoc命令自动导出注释. 文档注释指紧邻API的注释, 如果遇到空行则会中止.
Names:
package names
interface names: 一般以-er或-able结尾
MixedCaps:
即Java中的驼峰式
GO中的identifier由字线,数字,下划线_组成, 并且开头不能是数字. 可分3种:
* exported identifier: 大写开头
* package identifier: 小写或下划线_开头
* blank identifier: 下划线_
Semicolons:
GO自动在行尾插入semicolon, 如果最后token是:
* identifier
* literal
* one of break continue, fallthrough return ++ -- ) ] }
根据解析规则, 控制结构的块开始标记{ 另起一行.
Control structures
if-else: 与传统C语言相同
redeclaration and reassignment: 使用short declaration必须保证at least one other variable is anew. 至少一个新变量
for: 有4种形式,
* for{...}, 死循环
* for condition {...}, 条件循环
* for init; condition; post {...}, 带初始条件后置循环, 其中init部分只能使用短声明定义新变量.
* for x := range xxx{...}, range循环
switch: 有2种形式,
* switch {...}, 非匹配选择
* switch expression {...}, 是匹配选择
select: 有1种形式,
* select {}, 非匹配选择
Type switch:
Go的类型检测与转换有type-assertion与type-switch. type-switch指x.(type)必须结合switch expression{}使用. 否则报错! 另一种替换用法是relect.TypeOf()
Funtions:
Multiple return values: 多值返回
Named result parameters: 命令返回参数
注意: Go中的method都是function(receiver, params...)形式. 但反之则不是. 另外, 只有本地类型才能定义method. cannot define new methods on non-local type. 所谓local type指在相同package path.
Defer:
defer, panic(), recover()配合使用.
理解Go的function机制, 需要明白defer stack, panic error, return value.
function无论正常结束或panic结束,都保证执行defer stack中的函数.
function如果正常结束或recover恢复panic error, 则会return value. 否则抛出panic error.
function执行defer stack时, 新的panic error会覆盖旧的panic error.
总结而言, function是Go基本的执行处理单元.
Data:
Allocation with new or make: 理解Go的new()与make()用法, 需要明白GO的数据类型知识.
* 根据功能划分:
基本类型: bool, int/uint/unitptr, float, complex, byte/rune/string, struct, array
指针类型: slice, map, chan, func, pointer,
接口类型: interface, error
当然nil类型也可以有pointer形式, 但不是GO的idiomatic. 接口类型是一种特殊的类型, 由<type,value>复合而成. 因为当且仅当<nil, nil>才是nil, 所以nil interface不一定等于nil.
* 根据零值(zero-value)划分:
基本类型的零值都是non-nil
指针类型与接口类型的零值都是nil. 其实说接口类型的零值是nil不大恰当,因为interface是由<type,value>组成, 如果type为基本类型,则value的零值就不会是nil了. 指针类型与接口类型也有指针形式, 这相当于C中指针的指针, 通过间接指针来访问数据不会是个理想的做法.
所以, 你不会用new()来创建指针类型的指针, 因为其零值是nil, 创建一个指向nil的间接指针有什么意义哦? 也不能用make()来创建基本类型的值,因为其拥有零值了.再初始化就无价值了. 至于接口类型比较奇葩, 其底层是<type,value>,且仅当<nil,nil>时才等于nil. 否则要用 x == nil || reflect.ValueOf(x).IsNil()来判断是否为nil.
Printing:
Go中print有2种选择, 一是builtin的print(), println()函数. 一是fmt package. 据说后者带有缓冲, 性能更优.
Builtin:
GO中builtin函数:
append(), copy(), delete()
len(), cap(), close()
new(), make()
complex(), real(), imag()
print(), println()
panic(), recover()
import, type, const, var block:
Go中可以将多条import, type, const, var组合为block.
在const block中使用iota表示line index(从0开始)
关于var, const的没有声明或定义:
变量的类型向后追溯, 直到第一个类型.
常量的定义向前追溯, 直到第一个定义.
init function:
每个go package(或者说go file)可以定义零个或多个init()函数. 在import package时会被执行, 但共执行顺序无保证. 注意: 每次import package都会执行init函数, 而不仅仅初次导入执行. 这与Java中的<clinit>方法不同.
Pointers vs Values:
对于类型T, T的method是receiver为T的method. *T的method是receiver为T或*T的method. 简单地说, T的method属于*T, 但反之不成立.
顺便记忆: cannot define new methods on non-local type.
Interface and methods:
interface是method的集合. struct是data的集合.
interface类型转换使用type-assertion与type-switch.
Import语法:
import [name] "path"
* name可以是空(默认), 点(当前), 下划线(无), 标识符(自定义)
* path可以是绝对路径(相对$GOPATH), 相对路径(相对当前go file). 注意: 结合vendor机制不能使用相对路径, 否则解析会出错.
Embedding:
interface, struct使用组合方式实现代码复用, 此区别与C++, Java等的继承.
Goroutine
go-chan
注意: channel 有三种: 读写chan, 只读chan, 只写chan. 后二者一般是作为形参. 因为一个channel只能读或写都是没有意义的.
使用select结合time.After()等可以实现定时阻塞.
Web server:
http.Handle()
http.ListenAndServe()
Effection Go的更多相关文章
- 读effection java
1.考虑用静态工厂方法代替构造器 public static Boolean valueOf(boolean b){ return b?Boolean.TRUE:Boolean.FALSE; } 静态 ...
- Angular2 - Starter - Pipes, Custom Pipes
在Angular2 模板中,我们在显示数据时,可以使用通道将数据转换成相应的格式的值的形式来显示,而且这不改变源数据.比如,我们可以使用date通道来转换时间显示的格式: {{date | date: ...
随机推荐
- MinGW 与MSVC的区别
Qt 中有两种方式编译,一种是MinGW ,另一种MSVC. 其中:MSVC是指微软的VC编译器 MingGW是指是Minimalist GNU on Windows的缩写.它是一个可自由使用和自由发 ...
- Windows Phone 8.1 FilePicker API
在 Windows Phone 8.1 中,增加了 FilePicker 的方式与文件打交道,最大的亮点在于这种方式不仅可以浏览手机上的文件,还可以浏览符合协议的应用里的文件! 比如点击 OneDri ...
- Hook技术简介(有用SDK写的例子)
钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到达后,在目标窗口处理函数之前处理它.钩子机 ...
- Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一.什么是指针? 简单来说: 指针就是内存地址 内存地址就是指针. ...
- Android addTextChangedListener(文本监听)参数解释及实现EditText字数监听
由于最近做项目要检测EditText中输入的字数长度,从而接触到了Android中EditText的监听接口,TextWatcher.它有三个成员方法,第一个after很简单,这个方法就是在EditT ...
- 简洁常用权限系统的设计与实现(四):不维护level,用递归方式构造树
第三篇中,我们通过维护节点的深度level,通过迭代所有的节点,只需要一次,就构造了树. 本篇,换一种方式. 好处是:不维护节点的深度level,增加和修改节点时,也不用维护.递归实现,代码比较清晰 ...
- ueditor在表单中的提交
近期一直在找一个比較好点的WEB文本编辑器.发现ueditor还是不错的.可是在表单提交数据后有一些问题.由于他不像曾经的版本号一样提供一个虚拟的文本框去提交数据,所以网上搜索的结果都不能用了.依据u ...
- MapReduce wordcount 输入路径为目录 java.lang.UnsatisfiedLinkError: org.apache.hadoop.io.nativeio.NativeIO$POSIX.stat(Ljava/lang/String;)Lorg/apache/hadoop/io/nativeio/NativeIO$POSIX$Stat;
之前windows下执行wordcount都正常,今天执行的时候指定的输入路径是文件夹,然后就报了如题的错误,把输入路径改成文件后是正常的,也就是说目前的wordcount无法对多个文件操作 报的异常 ...
- Swift过程控制和功能
流量控制(Control Flow) For周期 for骑自行车和C语言,OC用法很相似,平时for()和 for in两种. 遍历可以使用下划线"_"略对值的訪问等. Switc ...
- 关闭Wind XP/Vista/Win7的DEP数据执行保护汇总(转)
数据执行保护 (DEP) 是一种Windows安全机制,从Windows版本顺序上看是从Windows XP SP2开始引入,通过监视程序以确保它们使用的系统内存是安全的,帮助防止操作系统受到病毒和其 ...