What?Godaddy(去你爹,X)Goahead(去个头,X)Golang(Go语言,YES)212年9月23日星期日Goahead...312年9月23日星期日Golangis⼀一个在语言层面实现了并发机制的类C通用型编程语言412年9月23日星期日WhyGolang?云计算时代,多核化和集群化是趋势传统软件不能充分利用硬件资源传统编程语言多核并发支持比较繁琐生产效率,少即是多512年9月23日星期日Go前世今生1995BellLabs,Plan9-Inferno(Limbo)2007/09Google's20%project2008/05Googlefull-timeproject2009/11officiallyannounced2012/03Go1Released612年9月23日星期日Go语言特性语言层面支持并发编程(go)优雅的错误处理机制(defer)简洁而又强大的面向对象表达(OOP)非侵入式接口(Interface)可扩展(Cgo)712年9月23日星期日特性(1)Go在语言层面支持并发812年9月23日星期日普通并发//inJava(简化,用标准库中的线程模拟并发)publicclassMyThreadimplementsRunnable{Stringarg;publicMyThread(Stringa){arg=a;}publicvoidrun(){//...}publicstaticvoidmain(String[]args){newThread(newMyThread(test)).start();//...}}912年9月23日星期日Go语言的并发funcrun(argstring){//...}funcmain(){gorun(test)...}1012年9月23日星期日goroutine启动⼀一个异步过程funcfoo(arg1T1,arg2T2){!//...}gofoo(arg1,arg2)1112年9月23日星期日goroutine交互//等待结束funcfoo(arg1T1,arg2T2,donechanbool){!//...!done-true}done:=make(chanbool)gofoo(arg1,arg2,done)//...-done//得到结果1212年9月23日星期日CSP没有共享内存,更没有内存锁通信靠channels来传递消息1312年9月23日星期日特性(2)优雅的错误处理机制1412年9月23日星期日Go错误处理范式//文件操作file,err:=os.Open(fileName)iferr!=nil{return}deferfile.Close()…//操作已经打开的f文件//锁操作varmutexsync.Mutex//...mutex.Lock()defermutex.Unlock()...//正常代码1512年9月23日星期日内建error类型typeerrorinterface{Error()string}1612年9月23日星期日普通资源释放//InJavaConnectionconn=...;try{Statementstmt=...;try{ResultSetrset=...;try{...//正常代码}finally{rset.close();}}finally{stmt.close();}}finally{conn.close();}1712年9月23日星期日Go的资源释放//InGolangconn:=...deferconn.Close()stmt:=...deferstmt.Close()rset:=...deferrset.Close()...//正常代码1812年9月23日星期日特性(3)简洁而又强大的面向对象表达1912年9月23日星期日结构体(Struct)//是类,不只是结构体typeFoostruct{!aint!bstring}func(this*Foo)Bar(arg1T1,arg2T2,...)(out1RetT1,...){!//...}2012年9月23日星期日面向对象typePointstruct{x,yint}func(p*Point)Get()(int,int){//Publicreturnp.x,p.y}func(p*Point)Put(x,yint){//Publicp.x=xp.y=y}func(p*Point)add(x,yint)int{//privatereturnp.x+p.y}2112年9月23日星期日模拟继承typeYetAnotherPointerstruct{Point//匿名字段zint}func(p*YetAnotherPointer)Get()(int,int,int){returnp.x,p.y,p.z}m:=YetAnotherPointer{Pointer{1,2},3}fmt.Println(m.Get())2212年9月23日星期日特性(4)非侵入式接口(Interface)2312年9月23日星期日普通接口实现classFooimplementsIFoo{//Java文法...}classFoo:publicIFoo{//C++文法...}IFoo*foo=newFoo;2412年9月23日星期日Go语言接口实现typeIBarinterface{!Bar(arg1T1,arg2T2,...)(out1RetT1,...)}typeFoostruct{...}varfooIFoo=new(Foo)2512年9月23日星期日非侵入式接口typePointerinterface{Get()(int,int)Put(x,yint)}typePointstruct{x,yint}func(p*Point)Get()(int,int){returnp.x,p.y}func(p*Point)Put(x,yint){p.x=xp.y=y}2612年9月23日星期日接口查询varainterface{}=...ifw,ok:=a.(io.Writer);ok{!//...}iffoo,ok:=a.(*Foo);ok{!//...}2712年9月23日星期日特性(5)可扩展(Cgo)与C的交互,是除了C++、Objective-C这两个以兼容C为前提的语言外中最简单的。2812年9月23日星期日C字符串转Go/*#includestdlib.hchar*GetString(){...}*/import“C”import“unsafe”funcGetString()string{cstr:=C.getString()str:=C.GoString(cstr)C.free(unsafe.Pointer(cstr))returnstr}2912年9月23日星期日更多特性模块化反射Unicode跨平台....3012年9月23日星期日内建类型切片(slice)arr:=make([]T,n)//make([]T,len,cap)arr:=[]T{t1,t2,...}slice:=arr[i:j]//arr[i:],arr[:j]字符串(string)str:=“Hello,world”substr:=str[i:j]字典(map)dict:=make(map[KeyT]ValT)dict:=map[KeyT]ValT{k1:v1,k2:v2,...}dict[k]=v3112年9月23日星期日切片(slice)//sliceappendvararr[]intarr=append(arr,1)arr=append(arr,2,3,4)arr2:=[]int{5,6,7,8}arr=append(arr,arr2...)//slicecopyvara=[...]int{0,1,2,3}vars=make([]int,2)n1:=copy(s,a[0:])//n1==2,s==[]int{0,1}n2:=copy(s,a[2:])//n2==2,s==[]int{2,3}3212年9月23日星期日字典(map)插入dict[k]=v删除delete(dict,k)查询v,ok:=dict[k]3312年9月23日星期日字符串(string)varsstring=“hello”s[0]=‘a’//Error//OKs1:=[]byte(s)s1[0]=‘a’s2:=string(s1)字符串⼀一旦定义,不可修改。字符串是字符的序列,不是字节的序列。3412年9月23日星期日基本类型bool(true,false)数字内型(有符号/无符号,有长度/无长度)string(内建”UTF-8”支持)array([n]type)slice(array[i:j])map(map[from_type]to_type)chanerror3512年9月23日星期日数字类型无长度int,uint有长度int8,int16,int32,int64byte/uint8,uint16,uint32,uint64float32,float643612年9月23日星期日控制语句ifswitchfor支持break,contine关键字3712年9月23日星期日ififx0{retuny}else{retunx}iferr:=os.Open(file);err!=nil{returnerr}doSomething(f)3812年9月23日星期日switchswitchval{caseexpr1[,expr2,expr3]://...caseexprN://...default://...}3912年9月23日星期日fallthroughswitchi{case0:case1:do()//如果i==0该函数不被调用}switchi{case0:fallthroughcase1:do()//如果i==0该函数会被调用}4012年9月23日星期日forforinit;condition;post{}//计数循环forcondition{}//while循环for{}//for{;;}死循环4112年9月23日星期日forsum:=0fori:=0;i10;i++{sum+=i}list:=[]string{a,b,c}fork,v:=rangelist{//...}4212年9月23日星期日函数funcName(arg1T1,arg2T2,...)RetT{!//...}funcName(arg1T1,arg2T2,...)(out1RetT1,out2RetT2,...){!//...}funcName(arg1T1,arg2T2,...)(out1RetT1,...,errerror){!//...}优势-输入输出清晰形象-错误处理规范4312年9月23日星期日gotofuncmyfunc(){i:=0Here:fmt.Println(i)i++gotoHere}4412年9月23日星期日闭包(closure)foo:=func(arg1T1,arg2T2,...)RetT{!//...}out:=foo(arg1,arg2,...)bar:=func(arg1T1,arg2T2,...)(out1RetT1,out2RetT2,...){!//...}out1,out2,...:=bar(arg1,arg2,...)4512年9月23日星期日PanicandRecoverfunccheck(errerror){!iferr!=nil{!!panic(err)!}}funcsafeHandler(fnhttp.HandlerFunc)http.HandlerFunc{!returnfunc(whttp.ResponseWriter,r*http.Request){!!deferfunc(){!!!ife,ok:=recover().(error);ok{!!!!http.Error(w,