Vim定制
command line - How to change visudo editor from nano to vim? - Ask Ubuntu
1 | sudo update-alternatives --config editor |
Ubuntu修改locale问题解决-Cannot set language to “zh_CN.utf-8”
1 | sudo dpkg-reconfigure locales |
1 | " Vim-Plug {{{ |
1 | sudo update-alternatives --config editor |
1 | sudo dpkg-reconfigure locales |
1 | " Vim-Plug {{{ |
从局部到全面。一小块,一小块。
从全面到局部。逐级增大。
Flex 布局教程:语法篇 - 阮一峰的网络日志
Flex 布局教程:实例篇 - 阮一峰的网络日志
1 | .icon { |
1 | .items { |
1 | type Na struct { |
1 | var v = make([]byte, 10, 20) |
1 | if val, ok := dict["foo"]; ok { |
1 | package main |
1 | // 方案1 |
1 | package main |
1 | package main |
1 | var cfg = beego.AppConfig |
Go语言里面提供了一个完善的net/http包,通过http包可以很方便的就搭建起来一个可以运行的Web服务。
同时使用这个包能很简单地对Web的路由,静态文件,模版,cookie等数据进行设置和操作。
万变不离其宗,Go的Web服务工作也离不开我们第一小节介绍的Web工作方式。
Go为了实现高并发和高性能, 使用了goroutines来处理Conn的读写事件, 这样每个请求都能保持独立,相互不会阻塞,可以高效的响应网络事件。这是Go高效的保证。
https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/03.4.md
1 | o := orm.NewOrm() |
[]orm.Params
1 | func analyseParams(params *[]orm.Params) { |
go build
来编译,可以来检验 lib 函数是否有错误,不会生成文件到 pkg 中去。go install
的时候,才会生成到 pkg 中。go env GOPATH
prints the effective current GOPATH; it prints the default location if the environment variable is unset.1 | go get -d -v ./... |
...
is a special pattern, tells to go down recursively
1 | gofmt -w -l src |
1 | timeStr := time.Now().Format("2006-01-02 15:04:05") |
Color成员的Tag还带了一个额外的omitempty选项,表示当Go语言结构体成员为空或零值时不生成JSON对象(这里false为零值)。
1 |
简洁 快速 安全
并行 有趣 开源
内存管理,数组安全,编译迅速
Executable commands must always use package main
, https://golang.org/doc/code.html#PackageNamespackage main
包表示它是一个可独立运行的包,它在编译后会产生可执行文件。
https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.1.md#详解
除了main包之外,其它的包最后都会生成*.a文件(也就是包文件)并放置在$GOPATH/pkg/$GOOS_$GOARCH中
每一个可独立运行的Go程序,必定包含一个package main,在这个main包中必定包含一个入口函数main,而这个函数既没有参数,也没有返回值。
Go使用package(和Python的模块类似)来组织代码。main.main()函数(这个函数位于主包)是每一个独立的可运行程序的入口点。Go使用UTF-8字符串和标识符(因为UTF-8的发明者也就是Go的发明者之一),所以它天生支持多语言。
_
操作常量使用关键字const
表示,不可用:=
语法定义。
var 语句定义了一个变量列表;
进一步阅读: https://blog.golang.org/gos-declaration-syntax
:=
这个符号直接取代了var和type,这种形式叫做简短声明。不过它有一个限制,那就是它只能用在函数内部;
在函数外部使用则会无法编译通过,所以一般用var方式来定义全局变量。_
(下划线)是个特殊的变量名,任何赋予它的值都会被丢弃。
数值:0
布尔:false
指针:nil
&
符号会生成一个指向其作用对象的指针;*
符号表示指针指向的底层的值;
传指针使得多个函数能操作同一个对象。
传指针比较轻量级 (8bytes),只是传内存地址,我们可以用指针传递体积大的结构体。如果用参数值传递的话, 在每次copy上面就会花费相对较多的系统开销(内存和时间)。所以当你要传递大的结构体的时候,用指针是一个明智的选择。
Go语言中channel,slice,map这三种类型的实现机制类似指针,所以可以直接传递,而不用取地址后传递指针。(注:若函数需改变slice的长度,则仍需要取地址传递指针)
slice 只能和nil 进行==
比较。
1 | c := make([]int, 0) |
Go没有类。然而,仍然可以在结构体类型上定义方法。
一个结构体(struct)就是一个字段的集合
1 | type S struct { |
但是S类型的结构体可以包含*S指针类型的成员,这可以让我们创建递归的数据结构,比如链表和树结构等。
1 | type S struct { |
匿名结构体中,
引用时可以直接访问子属性,而不需要给出完整的路径
但结构体字面值必须遵循形状类型声明时的结构
1 | type Point struct { |
1 | b := a[:0] |
这个默认行为类似java中的public。
大写字母开头的变量是可导出的,也就是其它包可以读取的,是公有变量;小写字母开头的就是不可导出的,是私有变量。
大写字母开头的函数也是一样,相当于class中的带public关键词的公有函数;小写字母开头的就是有private关键词的私有函数。
http://go-tour-zh.appspot.com/basics/3
当匿名字段是一个struct的时候,那么这个struct所拥有的全部字段都被隐式地引入了当前定义的这个struct。
struct不仅仅能够将struct作为匿名字段、自定义类型、内置类型都可以作为匿名字段,而且可以在相应的字段上面进行函数操作
如果内层与继承层都有相同的字段,则:
method是附属在一个给定的类型上的,他的语法和函数的声明语法几乎一样,只是在func后面增加了一个receiver(也就是method所依从的主体)。
1 | type Rectangle struct { |
在使用method的时候重要注意几点:
.
访问,就像struct里面访问字段一样指针作为Receiver会对实例对象的内容发生操作,而普通类型作为Receiver仅仅是以副本作为操作对象,并不对原实例对象发生操作。
那是不是method只能作用在struct上面呢?当然不是咯,他可以定义在任何你自定义的类型、内置类型、struct等各种类型上面。这里你是不是有点迷糊了,什么叫自定义类型,自定义类型不就是struct嘛,不是这样的哦,struct只是自定义类型里面一种比较特殊的类型而已,还有其他自定义类型申明,可以通过如下这样的申明来实现。type typeName typeLiteral
1 | type ages int |
在Go中函数也是一种变量,我们可以通过type来定义它,它的类型就是所有拥有相同的参数,相同的返回值的一种类型
type typeName func(input1 inputType1 , input2 inputType2 [, ...]) (result1 resultType1 [, ...])
函数作为类型到底有什么好处呢?那就是可以把这个类型的函数当做值来传递
因此在Go语言里,我们为一些简单的数值、字符串、slice、map来定义一些附加行为很方便。
方法可以被声明到任意类型,只要不是一个指针或者一个interface。
https://yar999.gitbooks.io/gopl-zh/content/ch6/ch6-01.html
此外,为了避免歧义,在声明方法时,如果一个类型名本身是一个指针的话,是不允许其出现在接收器中的,比如下面这个例子:
https://yar999.gitbooks.io/gopl-zh/content/ch6/ch6-02.html
1 | type P *int |
Go里面的面向对象是如此的简单,没有任何的私有、公有关键字,通过大小写来实现(大写开头的为公有,小写开头的为私有),方法也同样适用这个原则。
空interface
在我们需要存储任意类型的数值的时候相当有用,因为他可以存储任意类型的数值。
神奇之处:在java中,必须现有interface,然后才有其继承类;而在go中,可以先有类,然后才有接口(当然,先有接口再有类更是可以的);https://github.com/astaxie/build-web-application-with-golang/blob/master/zh/02.6.md
简单的说,interface是一组method 签名的组合,我们通过interface来定义对象的一组行为。
make
来创建channelmake用于内建类型(map、slice 和channel)的内存分配。new用于各种类型的内存分配。
- new返回指针。
new(T)分配了零值填充的T类型的内存空间,并且返回其地址,即一个*T类型的值。用Go的术语说,它返回了一个指针,指向新分配的类型T的零值。- make返回初始化后的(非零)值。
make只能创建slice、map和channel,并且返回一个有初始值(非零)的T类型,而不是*T。 在这些项目被初始化之前,slice为nil。
注意:所有字符都是UTF-8处理。
字符串的处理可以使用strings
包来进行搜索(Contains, Index)、替换(Replace)和解析(Split、Join)等操作
当创建一个包,一般要用短小的包名,但也不能太短导致难以理解。
包名一般采用单数的形式。标准库的bytes、errors和strings使用了复数形式,这是为了避免和预定义的类型冲突,同样还有go/types是为了避免和type关键字冲突。
https://yar999.gitbooks.io/gopl-zh/content/ch10/ch10-06.html