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的更多相关文章

  1. 读effection java

    1.考虑用静态工厂方法代替构造器 public static Boolean valueOf(boolean b){ return b?Boolean.TRUE:Boolean.FALSE; } 静态 ...

  2. Angular2 - Starter - Pipes, Custom Pipes

    在Angular2 模板中,我们在显示数据时,可以使用通道将数据转换成相应的格式的值的形式来显示,而且这不改变源数据.比如,我们可以使用date通道来转换时间显示的格式: {{date | date: ...

随机推荐

  1. 使用SQLiteHelper创建数据库并插入数据 分类: H1_ANDROID 2013-11-05 22:44 1398人阅读 评论(0) 收藏

    参考<疯狂android讲义>8.4节P424 1.获取SQLiteDatabase实例有2种方法,一是直接new SQLiteDatabase(),另一种使用SQLiteHelper.一 ...

  2. [内核编程] visual studio 2010配置驱动开发环境

    visual studio 2010 配置驱动开发环境 ** 工具/材料 VS2010.WDK开发包 **  配置过程 以下将讲述VS2010驱动开发环境的配置过程,至于必要软件的安装过程这里不再赘述 ...

  3. VS2008的C++TR1库已经支持正则表达式

    作者:朱金灿 来源:http://blog.csdn.net/clever101 发现VS2008的C++ TR1库已经支持正则表达式了(注意装了VS 2008sp1采用TR1库的).下面简单做个测试 ...

  4. [Angular] Auxiliary named router outlets

    Define a auxilliary router: export const ROUTES: Routes = [ { path: 'folder/:name', component: MailF ...

  5. Android自定义组件系列【2】——Scroller类

    在上一篇中介绍了View类的scrollTo和scrollBy两个方法,对这两个方法不太了解的朋友可以先看<自定义View及ViewGroup> scrollTo和scrollBy虽然实现 ...

  6. ubuntu系统安装和配置

    1.分区信息 1.1 /boot分区 这个分区包括了操作系统的内核和在启动系统过程中所要用到的文件.假设有了一个单独的/boot启动分区,即使基本的根分区出现了问题,计算机依旧可以启动.这个分区的大小 ...

  7. 分布式ID解决方案

    开发十年,就只剩下这套Java开发体系了 >>>   在游戏开发中,我们使用分布式ID.有很多优点 便于合服 便于ID管理 等等 一.单服各自ID系统的弊端 1. 列如合服 在游戏上 ...

  8. 找不到头文件xxxxx.h file not found

    项目里有该文件,但是还是显示找不到.或者是cocopods打开的项目. 原因:.h文件路径找不到.具体找不到的原因有很多种. 1.一般会设置 IOS引用三方framewrok的头文件出现'xxxxx/ ...

  9. 简洁常用权限系统的设计与实现(四):不维护level,用递归方式构造树

    第三篇中,我们通过维护节点的深度level,通过迭代所有的节点,只需要一次,就构造了树.  本篇,换一种方式. 好处是:不维护节点的深度level,增加和修改节点时,也不用维护.递归实现,代码比较清晰 ...

  10. 【u219】最长链

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 现给出一棵N个结点二叉树,问这棵二叉树中最长链的长度为多少,保证了1号结点为二叉树的根. [提示] 关 ...