2007年 google作为20%项目开始研发
2009年11月10日 开源,获得TIOBE年度语言
2012年3月28日 发布Go1.0版本
2016年8月18日 发布Go1.7版本
Robert Griesemer (V8,Chubby,HotSpot JVM)
Rob Pike(Unix,UTF-8,plan9)
Ken Tompson(B语言、C语言、Unix之父,图灵奖)
lan Lance Taylor(GCC)
Brad Fitzpatrick(Memcache,HTTP2)
gopher:囊地鼠(产自北美的一种地鼠)
(https://github.com/golang/go/blob/master/doc/gopher/favicon.svg)
设计Go语言是为了解决当时Google内部开发的一些痛点
所处的环境:
遇到的问题是:
所以Go语言是一门工程上的实用主义语言
break | default | func | interface | select |
case | defer | go | map | struct |
chan | else | goto | package | switch |
const | fallthrough | if | range | type |
continue | for | import | return | var |
- 程序声明:import、package
- 程序实体声明和定义:chan、const、func、interface、map、struct、type、var
- 程序流程控制:go、select、break、case、continue、default、defer、else、fallthrough、for、goto、if、range、return、switch
type Person struct {
Name string
Age uint8
Address string
}
+ | & | += | &= | && | == | != | ( | ) |
- | | | -= | |= | || | < | <= | [ | ] |
* | ^ | *= | ^= | <- | > | >= | { | } |
// | << | /= | <<= | ++ | = | := | , | ; |
% | >> | %= | >>= | – | ! | … | . | : |
&^ | &^= |
优先级
优先级 | 操作符 |
---|---|
5 | * / % << >> & &^ |
4 | + - | ^ |
3 | == != < <= > >= |
2 | && |
1 | || |
type MyString string //MyString是实际类型,string是潜在类型
var v Type var v Type = value var v = value var v1,v2,v3 Type var v1,v2,v3 Type = value1,value2,value3 var v1,v2,v3= value1,value2,value3 v1,v2,v3:= value1,value2,value3 i,j = j,i //Tips::=为简短声明,编译器根据初始化的值自动推断相应的类型,但是不能定义在函数外部使用。 const cname = value const cname type = value //Tips:声明但未使用的变量会在编译阶段报错。 //声明分组 import( “fmt” “os” ) const( s = “string” pi = 3.1415 pi2 ) var( i int pi float32 = 3.1415 ) iota枚举:为分组中iota++ const( a = 1+iota*2 b c = “iota” d )
var a [2]int = [2]int{1,2} a := [2]int{1,2} a := [...]int{1,2,3,4} a2 := [2][3]int{[3]int{1,2,3},[3]int{3,2,1}} a2 := [2][3]int{{1,2,3},{3,2,1}}
slice是引用类型
var s []int = make([]int,n) s := []int{v1,v2,v3}
copy(dst,src []Type)int //dst必须初始化完成,长度根据需要初始化 append(slice []Type,elems ...Type)[]Type len(slice []Type)int cap(slice []Type)int
s[:j] == s[0:j] s[i:] == s[i:len(s)] s[i:j]:包含index区间为[i,j)s的元素 //不能代替array和slice的copy操作,切片后是原数据的引用
引用类型,无序,长度不定,非线程安全
var m map[keyType]valueType //keyType可以是string及完全定义了==/!=操作的类型 m := make(map[keyType]valueType) m:=map[keyType]valueType{k1:v1,k2:v2,k3:v3} len(m map[keyType]valueType)int delete(m map[Type]Type1,key Type)
引用类型,goroutine之间通信的通道
c := make(chan Type,n)//不初始化为nil c
var c chan
close(ch) /* 关闭一个已关闭的channel会导致panic 向已关闭的channel中写数据会导致panic 从已关闭的channel中读数据不会导致panic v,ok :=
if x := getX();x > 0{ //... }else if x == 0{ //... }else{ //... }//依次逐条匹配,若匹配则进入逻辑块
case e1: //... case e2,e3: //... fallthrough default: //... } //sExpr需要和case的expr类型一致,如果sExpr不存在,则比较类型为bool,只有true可以被匹配
for e1;e2;e3{ } for expression{ } //for + range 遍历slice和map数据
break:跳出当前循环,可以配合标签使用
continue:跳过本次循环,可以配合标签使用
for+range 遍历array/slice/map/string,循环接收channel中的数据
Range expression 1st value 2nd value
array or slice a [n]E, *[n]E, or []E index i int a[i] E
string s string type index i int see below rune
map m map[K]V key k K m[k] V
channel c chan E, <-chan E element e E
多channel的场景中,使用select机制,监听各个channel上的数据流动,默认阻塞,当监听的channel中有发送或可接收时才会工作,所有channel都准备好时,随机选择一个执行
select{ case c1
func myFunc(){ i := 0 Here: i++ goto Here }
func funcName(input1 Type,input2 Type)([output1] Type,[output2] Type){ return value1,value2 }
只有一个返回值且不声明返回变量,返回值的括号可以省略
没有返回值可以省略包括返回值的括号,且可以不需要return
如果有复数个相同Type的参数或返回值,可以省略重复Type声明,比如(a int,b int) =>(a,b int)
如果函数是导出的,建议命名返回值,提高可读性
func funcName(arg ...Type){} //arg为[]Type
使用指针类型传参
可以共同操作同一对象
传指针很轻量级,8B(64位机),对一些大的struct,在copy上会花费较多的系统开销
First-class value:可以作为别的函数的参数、返回值,可以赋值给变量,或者成为类型,函数式编程范式
func adder() func(int) int { sum := 0 return func(x int) int { sum += x return sum } }
//在函数返回之前,先进后出执行defer语句,一般在需要资源回收的时候使用
func main(){ //... } //package main中必须包含一个main函数,是程序的入口函数
func init(){ //some init logic... } /*一个package中最好只写一个init 1.如果package中需要import其他包,则先导入其他包 2.所有包import完毕后,依次初始化cons->var->init() */
中断控制流程,之前入栈的defer函数依然会执行,然后返回到被调用的地方,调用方也认为触发了panic行为。依次向上,直到发生panic的goroutine上所有调用函数返回,导致程序退出
来源:调用panice,runtime error(数组越界,0值除数)
恢复panic,存在于defer函数中才有效
一种自定义用户类型
初始化
P := person{“iota”,22} //顺序初始化 P := person{age:22,name:”iota”} //field:value初始化 P := new(person) //new初始化
匿名字段
匿名字段可以是任意内置类型、struct、自定义类型
匿名字段命名冲突问题:最外层访问优先
Tag
1.7 截止2016/12
可执行文件安装
源码安装
GOROOT
GOPATH