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()