1.2 学好 Go 的注意事项
学好Go的注意事项
每个语言都有自己的一些强制规定,只有有些语言规定的少一些,有些语言规定的多一些。有些语言的规定并不会那么强硬,有些语言却非常强硬。比如Python就强制使用空格或者tab来框出代码段,而相反C语言虽然约定用{}来框出代码段,但是并不强制你是怎么写的:
f1(){int i=3;intj=5;}
f2()
{
int i=3;
intj=5;
}
f3(){
int i=3;
intj=5;
}
在C中以上三种写法都能够编译过去,但是在GO中只有第三种可以编译过去,这个就是GO语言的强制规定。C和java习惯了{另起一行的一定注意,要不然一开始写代码编译不过去就会不知所措。
Go语法规范点
- {必须在行尾,必须在行尾,必须在行尾(重要的事情说三遍)
- 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Run,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像java里面的public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像java中的 private )。
- import,如果你引入多个写成下面的形式
注意其中第三行,import{ "os" "fmt" _ "github.com/go-sql-driver/mysql" )
_
的作用是引入这个包只使用它的初始化函数,而不需要使用这个代码包中的任何其他部分。
如果你导入了一个包却没有使用它,则会在构建程序时引发错误,如 imported and not used: os,这正是遵循了 Go 的格言:"没有不必要的代码!"。
4.Go在不使用结构的情况下,可以一次返回多个值。多个返回值如果有error返回,这个返回值必须是最后一个。
5.变量定义。Go和很多语言都不同,它在声明变量时将变量的类型放在变量的名称之后。var i int 也可以使用:=来定义变量,比如:i:=1。Go的变量是属于强关系型的,一旦定义了类型就不能够变。
6.空标识符的使用。GO语言里面用_
表示空标识符。这个符号的作用是,把一个返回结果返回给一个变量,但是这个变量有不需要被使用的时候,我们往往使用_
。
sessUsername, _ := this.GetSession("editor_username").(string)
这段代码就是返回的error,我们不做处理。 还有一种情况会使用,那就是我们在开发中京城碰到的情况,我们写了一个函数F1(),在测试的时候那个返回值可能还没有用到,这个时候写成
f:=F1()
编译的时候会返回,f为使用的错误,这个时候可以写成这样
_=F1()
7.主函数main必须属于package main
8.Go的时间处理,先看代码
// @Param beginDay string 起始日期
// @Return result int 返回日期差值
// 这个函数的作用是为了返回两个日期之间的差值。
// 比如: DaydiffNow("2015-11-01") 返回与当前日期的差值
func DaydiffNow(beginDay string) int {
begin, _ := time.Parse("2006-01-02 15:04:05", beginDay+" 00:00:00")
diff := time.Now().Unix() - begin.Unix()
return int(diff / (24 * 60 * 60))
}
2006-01-02 15:04:05这个绝对是个奇葩写法,据说是Go的诞生时间。
这个字符串的记忆方式是6-1-2-3(下午15点)-4-5 (也有种说法是:2006是go语言在google内部谋划的日子,后面依次是1、2、15(3)、4、5的顺序表示。)
package main
import (
"fmt"
"time"
)
func main() {
fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
}
这个是格式化显示当前时间,"2016-05-30 16:14:48"
9.尽量不要在程序里面包含panic。
如何学好GO
- 经常浏览Go的官方网站http://golang.org,不过要看这个网站居然要翻墙。如果在墙内可以多上一下GO lang中国http://golangtc.com/
- 多浏览代码包文档网站http://godoc.org,可以找到更多的语言支持包。
- 有问题去http://stackoverflow.com/请教。请教问题是有技巧的,这个技巧请阅读这个文章-《提问的智慧》https://github.com/FredWe/How-To-Ask-Questions-The-Smart-Way/blob/master/README-zh_CN.md
- 语言规范尽量尊属谷歌的https://github.com/golang/go/wiki/CodeReviewComments
Go 谚语
Simple, Poetic, Pithy
Don't communicate by sharing memory, share memory by communicating.不要通过共享内存进行通信, 通过通信共享内存
Concurrency is not parallelism.
Channels orchestrate; mutexes serialize.
The bigger the interface, the weaker the abstraction.接口越大, 抽象越弱
Make the zero value useful.
interface{} says nothing. 该谚语不是说 interface {} 不代表任何东西, 而是说该类型无静态检查以及调用时保证, 比如你的 func 接收一个 interface{} 类型, 你写的时候是可用的, 但是某个时间你进行了代码重构可能坏掉了 。
Gofmt's style is no one's favorite, yet gofmt is everyone's favorite.
A little copying is better than a little dependency.
Syscall must always be guarded with build tags.
Cgo must always be guarded with build tags.
Cgo is not Go.
With the unsafe package there are no guarantees.
Clear is better than clever.写清晰的代码, 不要写聪明的代码
Reflection is never clear.
Errors are values.错误也是一种值
Don't just check errors, handle them gracefully.
Design the architecture, name the components, document the details.
Documentation is for users.
Don't panic.