版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
\hGo编程语言指南。本指南涵盖了该语言的大部分重要特性,主要包Go流程控制语句:for、if、else和复杂类型:struct、slice和学习如何基于已有类型定义新的类型:本课涵盖了结构体、数组、slice作为语言的核心部分,Gogorouteinchannel,以及如何使用它们来实现不同的并发Go将并发作为语言的核心构成。本课将对其进行介绍,并提供了一些示例来Go程序都是由包组成的。\hpackagepackageimportfuncmain()fmt.Println("Myfavoritenumberis",packagepackageimportfuncmain()fmt.Printf("Nowyouhave%gproblems.",math.Nextafter(2,导🎧Go中,首字母大写的名称是被导出的。packagepackageimport(funcmain(){(参考\hGo语法定义的文章了解类型以这种形式出现的原因。packagepackageimportfuncadd(xint,yint)intreturnx+funcmain(){fmt.Println(add(42,13))Xint,y x,yx,yintx,ypackagepackageimportfuncadd(x,yint)intreturnx+funcmain(){fmt.Println(add(42,13))mutiple-packagepackageimportfuncswap(x,ystring)(string,string)returny,funcmain()a,b:=swap("hello","world")fmt.Println(a,b)Gopackagepackageimportfuncsplit(sumint)(x,yint){x=sum*4/9y=sum-funcmain(){packagepackageimportvarc,python,javafuncmain()varifmt.Println(i,c,python,packagepackageimportvari,jint=1,funcmain()varc,python,java=true,false,"no!"fmt.Println(i,j,c,python,java)packagepackageimportfuncmain()vari,jint=1,2k:=3c,python,java:=true,false,fmt.Println(i,j,k,c,python,Gointint8int16int32uintuint8uint16uint32uint64uintptrbyte//uint8的别名runeint32Unicodefloat32float64complex64complex128packagepackageimportvar MaxIntuint64==1<<64- complex128=cmplx.Sqrt(-5+funcmain()constf="%T(%v)\n"fmt.Printf(f,ToBe,ToBe)fmt.Printf(fmt.Printf(f,MaxInt,MaxInt)fmt.Printf(f,z,z)数值类型为布尔类型为packagepackageimportfuncmain()varivarffloat64varbboolvarsstringfmt.Printf("%v%v%v%q\n",i,f,b,CGo的在不同类型之间的项目赋值时需要显式转换。试着移除例float64int的转换看看会发生什么。packagepackageimportfuncmain()varx,yint=3,varffloat64=math.Sqrt(float64(x*x+varzint=int(f)fmt.Println(x,y,z)varvarivpackagepackageimportfuncmain()v:=42//changeme!fmt.Printf("visoftype%T\n",v)packagepackagemainimport"fmt"constPi=3.14funcmain()constWorld="世界"fmt.Println("Hello",World)fmt.Println("Happy"Pi"Day")constTruth=fmt.Println("Gorules?",packagepackageimportconst =1<<Small=Big>>funcneedInt(xint)int{returnx*10+1funcneedFloat(xfloat64)float64returnx*funcmain(){Go只有一种循环结构——`for`Java中做的一样,而`{}`packagepackageimportfuncmain(){sum:=0fori:=0;i<10;i++{sum+=iCJavafor-packagepackageimportfuncmain(){sum:=1for;sum<1000;{sum+=sumfor是Go的基于此可以省略分号:CwhileGo中叫做`for`packagepackageimportfuncmain(){sum:=1forsum<1000{sum+=sumpackagepackagefuncmain()forif语句除了没有了`()`之外(甚至强制不能使用它们),C(耳熟吗packagepackageimportfuncsqrt(xfloat64)stringifx<0returnsqrt(-x)+returnfuncmain(){fmt.Println(sqrt(2),sqrt(-4))packagepackageimportimportfuncpow(x,n,limfloat64)float64ifv:=math.Pow(x,n);v<limreturnreturnfuncmain(){pow(3,2,pow(3,3,ifpackagepackageimportfuncpow(x,n,limfloat64)float64ifv:=math.Pow(x,n);v<limreturn}elsefmt.Printf("%g>=%g\n",v,vreturnfuncfuncmain(){pow(3,2,pow(3,3,z常小)\hmath.Sqrt接近吗?packagepackageimportfuncSqrt(xfloat64)float64funcmain(){packagepackageimportfuncmain(){fmt.Print("Gorunson")switchos:=runtime.GOOS;oscase"darwin":fmt.Println("OSX.")case"linux"://freebsd,//plan9,windows...fmt.Printf("%s.",os)switch(switchswitchi{case0:casef():i==0`f`。注意:Goplayground2009-11-1023:00:00UTCpackagepackageimportfuncmain()fmt.Println("When'sSaturday?")today:=time.Now().Weekday()switchtime.Saturday{casetoday+0:casetoday+1:casetoday+2:fmt.Println("Intwodays.")fmt.Println("Toofarswitch`switchtrue`if-then-elsepackagepackageimportfuncmain()t:=t:=switchcaset.Hour()<12:fmt.Println("Goodmorning!")caset.Hour()<17:fmt.Println("Goodafternoon.")fmt.Println("Gooddeferpackagepackageimportfuncmain()defer阅读\h博文了解更多关于deferpackagepackageimportfuncfuncmain()fori:=0;i<10;i++deferGo类型*TT`nil`varp &ii:=p=fmt.Println(*pfmt.Println(*pp*p=通过指针p设置与C不同,Go没有指针运算。packagepackageimportfuncmain()i,j:=42,p:=//pointtofmt.Println(*p)//readithroughthe*p=21 //setithroughthepointerfmt.Println(i)//seethenewvalueofip=p= //pointto*p=*p/37 //dividejthroughthepointerfmt.Println(j)//seethenewvalueofjpackagepackageimporttypeVertexstructXintYfuncmain(){fmt.Println(Vertex{1,2})struct-packagepackageimporttypeVertexstructXintYfuncfuncmain()v:=Vertex{1,v.X=struct-packagepackageimporttypeVertexstructXintYfuncmain()v:=Vertex{1,2}p:=&vp.X=struct-packagepackageimporttypeVertexstruct{X,Yintvarv1=Vertex{1,2}//类型为Vertexv2=Vertex{X:1}//Y:0被省略v3=Vertex{} //X:0和Y:0p=&Vertex{12funcmain(){fmt.Println(v1,p,v2,v3)vara a约,但是请不要担心;Go提供了更加便利的方式来使用数组。packagepackageimportfuncmain()vara[2]stringa[0]="Hello"a[1]=fmt.Println(a[fmt.Println(a[0],a[1])slice[]TTslicepackagepackageimportfuncmain()p:=[]int{2,3,5,7,11,fmt.Println("p==",fori:=0;i<len(p);i++{fmt.Printf("p[%d]==%d\n",i,p[i])sliceslice值指向相同的数组。 lohi-1slice slicing-packagepackageimportfuncmain()p:=[]int{2,3,5,7,11,fmt.Println("p==",p)fmt.Println("p[1:4]==",p[1:4])0fmt.Println("p[:3]==",len(s)fmt.Println("p[4:]==",构造slicemakeslice指向a:=make([]int,5)// 为了指定容量,可传递第三个参数到bb:=make([]int,0,5)//len(b)=0,b=b[:cap(b)]//len(b)=5,b= //len(b)=4,packagepackageimportfuncmain()a:=make([]int,5)printSlice("a",a)bb:=make([]int,0,5)printSlice("b",b)c:=printSlice("c",c)d:=c[2:5]printSlice("d",funcprintSlice(sstring,x[]int){fmt.Printf("%slen=%dcap=%d%v\n",s,len(x),cap(x),slice`nil`nilslice0nil-packagepackageimportfuncmain()varzfmt.Println(z,len(z),ifz==nil{向slice添加元素sliceGo`append`\h文档appendfuncappend(s[]T,vs...T) appendsTT的值将会添加到slice。appendsliceslices的slice会指向这个新分配的数组。(slice\hslice:使用和内幕。packagepackageimportfuncmain()vara[]intprintSlice("a",a)//appendworksonnilslices.a=append(a,0)printSlice("a",a)//theslicegrowsasneeded.a=append(a,1)printSlice("a",a)//wecanaddmorethanoneelementatatime.a=append(a,2,3,4)printSlice("a",funcprintSlice(sstring,x[]int){fmt.Printf("%slen=%dcap=%d%v\n",s,len(x),cap(x),forrangeslicemappackagepackageimportvarpow=[]int{1,2,4,8,16,32,64,funcmain()fori,v:=rangepow{fmt.Printf("2**%d=%d\n",i,v)如果只需要索引值,去掉value”packagepackageimportfuncmain()pow:=make([]int,fori:=rangepow{pow[i]=1<<uint(i)for_,value:=rangepow{fmt.Printf("%d\n",value)实现`Pic`。它返回一个slice的长度`dy`,和slice中每个元素的长度的8`dx`。当执行这个程序,它会将整数转换为灰度(好吧,蓝度)图片的实现已经完成。可能用到的函数包括(x+y)/2x*y`x^y`(\h(需要使用循环来分配[][]uint8`[]uint8`。packagepackageimport"/p/go-funcPic(dx,dyint)[][]uint8funcmain(){mapmapmakenewnilmap是空packagepackageimporttypetypeVertexstruct{Lat,Longvarmmap[string]Vertexfuncmain(){m=make(map[string]Vertex)m["BellLabs"]=Vertex{40.68433,-fmt.Println(m["Bellmap的文法mappackagepackageimporttypeVertexstruct{Lat,Longfloat64varm=map[string]Vertex{"BellLabs":Vertex{40.68433,-"Google":Vertex{37.42202,-122.08408,funcmain(){的文法packagepackageimporttypeVertexstruct{Lat,Longfloat64varm="BellLabs":{40.68433,- {37.42202,-funcmain(){修改mapmm[key]= elem= delete(m, elem,ok= keym中,`ok`trueok`false`elemmapmap的元素类型的零packagepackageimportfuncmain()m:=m["Answer"]=fmt.Println("Thevalue:",m["Answer"]=fmt.Println("Thevalue:",delete(m,fmt.Println("Thevalue:",v,ok:=fmt.Println("Thevalue:",v,"Present?",`WordCount`s“词”map\hstrings.Fieldspackagepackageimport"/p/go-funcWordCount(sstring)map[string]intreturnmap[string]int{"x":funcmain(){packagepackageimportfuncmain()hypot:=func(x,yfloat64)float64returnmath.Sqrt(x*x+fmt.Println(hypot(3,Go函数可以是闭包的。闭包是一个函数值,它来自函数体的外部的变量引“绑定”在这packagepackageimportfuncadder()func(int)int{sum:=0returnfunc(xint)int{sum+=xreturnfuncmain()pos,neg:=adder(),fori:=0;i<10;i++{packagepackageimportfibonacciintfuncfibonacci()func()intfuncmain()f:=f:=fori:=0;i<10;i++{GopackagepackageimporttypeVertexstruct{X,Yfloat64func(v*Vertex)Abs()float64returnmath.Sqrt(v.X*v.X+funcmain()v:=&Vertex{3,4}packagepackageimporttypeMyFloatfunc(fMyFloat)Abs()float64iff<0returnfloat64(-returnfuncmain()f:=MyFloat(-math.Sqrt2)MyFloatAbsScaleVertex代替*Vertex作为接收vVertexScale方法没有任何作用。`Scale``v`vAbs`v`。所以读取的是原始值(通packagepackageimporttypeVertexstruct{X,Yfloat64func(v*Vertex)Scale(ffloat64)v.X=v.X*v.Y=v.Y*func(v*Vertex)Abs()float64returnmath.Sqrt(v.X*v.X+funcmain()v:=&Vertex{3,4}fmt.Println(v,v.Abs())注意:例子代码的加粗标红Abs只定义在(指针类型)Vertex(值类型)`Abser`packageimporttypeAbserinterface{Abs()float64funcmain()varaf:=MyFloat(-math.Sqrt2)v:=Vertex{3,4}a=f//aMyFloat实现了Absera&va*Vertex实现了下面一行,vVertex(AbsertypeMyFloatfunc(fMyFloat)Abs()float64iff<0returnfloat64(-returntypeVertexstruct{X,Yfloat64func(v*Vertex)Abs()float64returnmath.Sqrt(v.X*v.X+\hioReader`Writer`packagepackageimporttypeReaderinterfaceRead(b[]byte)(nint,errtypeWriterinterfaceWrite(b[]byte)(nint,errtypeReadWriterinterface{funcmain()varwos.StdoutWriterw=os.Stdoutfmt.Fprintf(w,"hello,\h\htypetypeStringerinterface{String()stringStringer是一个可以用字符串描述自己的类型。`fmt`(还有许多其他packagepackageimporttypePersonstruct{NamestringAgefunc(pPerson)String()stringreturnfmt.Sprintf("%v(%vyears)",p.Name,funcmain()a:=Person{"ArthurDent",z:=Person{"ZaphodBeeblebrox",9001}fmt.Println(a,z)例如,`IPAddr{1,`2,`3,`4}`应当输出`""`。packagepackageimporttypeIPAddr//TODO:Adda"String()string"methodtofuncmain()addrs:=map[string]IPAddr{"loopback":{127,0,0,1},"googleDNS":{8,8,8,forn,a:=rangeaddrs{fmt.Printf("%v:%v\n",n,a)Goerrorfmt.Stringer类似,`error`typetypeerrorinterface{Error()string(fmt.Stringer类似,`fmt``error`。`nil`i,i,err:=strconv.Atoi("42")iferr!=nil{fmt.Printf("couldn'tconvertnumber:%v\n",fmt.Println("Convertedinteger:",errornilnilerrorpackagepackageimporttypeMyErrorstruct{Whentime.TimeWhatstringfunc(e*MyError)Error()stringreturnfmt.Sprintf("at%v,%s",e.When,e.What)funcrun()errorreturn&MyError{"itdidn'tfuncmain()iferr:=run();err!=nil{Sqrtnil的错误值。复数同样也不被支typetypeErrNegativeSqrtfuncfunc(eErrNegativeSqrt)Error()`error`ErrNegativeSqrt(-`"cannotSqrtnegativenumber:2"`packagepackageimportfuncSqrt(xfloat64)(float64,error)return0,funcmain(){ioio.ReaderGo标准库包含了这个接口的\h许多实现func(T)Read(b[]byte)(nint,err Readslice\hstrings.Reader8字节的速度读取它packagepackageimportfuncmain()r:=strings.NewReader("Hello,b:=make([]byte,forn,err:=fmt.Printf("n=%verr=%vb=%v\n",n,err,b)fmt.Printf("b[:n]=%q\n",b[:n])iferr==io.EOFReaderASCII字符'A'packagepackageimport"/p/go-typeMyReader//TODO:AddaRead([]byte)(int,error)methodtofuncmain(){\hio.Reader`io.Reader`,然后通过某种形式修改数例如,\hgzip.NewReader`io.Reader`(压缩的数据流)并且返回同样io.Reader的`*gzip.Reader`(解压缩后的数据流)。io.Reader`rot13Reader`io.Reader\hrot13Read`io.Reader`packagepackageimport(typerot13Readerstruct{rio.Readerfuncmain()ss:=strings.NewReader("Lbhpenpxrqgurpbqr!")r:=rot13Reader{s}io.Copy(os.Stdout,服务器\hhttphttp.HandlerHTTPpackagepackagetypeHandlerinterfaceServeHTTP(wResponseWriter,rHello`http.Handler`。\hhttp://localhost:4000/会看到来自程序的问候。web的指南用户界面运行。为了尝试编写服务器,可能需要\hGoweb-packagepackageimporttypeHellofunc(hHello)ServeHTTP(whttp.ResponseWriter,r*http.Request){fmt.Fprint(w,"Hello!")funcmain()varherr:=http.ListenAndServe(err:=http.ListenAndServe("localhost:4000",iferr!=nil{处理ServeHTTPweb服务器中注册它typetypeStringtypeStructstruct{Greetingstring http.Handle("/string",String("I'mafrayedknot."))http.Handle("/struct",http.Handle("/string",String("I'mafrayedknot."))http.Handle("/struct",&Struct{"Hello",":","Gophers!"})webweb服务,你可能需要\h安装Go。packagepackageimportfuncmain()//yourhttp.Handlecallsherelog.Fatal(http.ListenAndServe("localhost:4000",nil))\hPackageimageImagepackagepackagetypeImageinterface{ColorModel()color.ModelBounds()RectangleAt(x,yint)*注意*:`Bounds`Rectangle\himage.Rectangleimage(参阅\h文档了解全部信息。\himage/color包packagepackageimportfuncmain()m:=image.NewRGBA(image.Rect(0,0,100,100))fmt.Println(m.At(0,image.ImagesliceImage类型,要实现\h必要的方法`pic.ShowImage`Bounds`image.Rectangle``image.Rect(0,0w,h)`ColorModel`color.RGBAModel``color.RGBA{v,v,255,255}`packagepackageimport"/p/go-typeImagestruct{}funcmain(){m:=Image{}goroutineGogogof(x,y,goroutinef(x,f(x,y,fxyzgoroutinegoroutine`f`goroutine在相同的地址空间中运行,因此访问共享内存必须进行同步。\hGo中并不经常用到,因为有其他的办法。(在接下packagepackageimportfuncsay(sstring)fori:=0;i<5;i++{time.Sleep(100*time.Millisecond)funcmain()gosay("world")channelchannel操作符<-chch vchannelchvchchvmapslice一样,channelch:=make(chan packagepackageimportfuncsum(a[]int,cchanint){sum:=0for_,v:=rangea{sum+=vcsum将和送入funcmain()a:=[]int{7,2,8,-9,4,c:=make(changosum(a[:len(a)/2],gosum(a[len(a)/2:],xyc,<-ccfmt.Println(x,y,缓冲channel_带缓冲的_make提供第二个参数作为缓冲长度来初始化一个缓冲channel:ch:=make(chanint, channel发送数据的时候,只有在缓冲区满的时候才会阻塞。当缓冲区buffered-packagepackageimportfuncmain()c:=make(chanint,2)c<-1c<-range和closechannel来表示再没有值会被发送了。接收者可以通过赋值语句的第二参数来测试channel是否被关闭:当没有值可以接收并且channelv,ok:=<- ok`false``forirangec`channel注意:只有发送者才能关闭channel,而不是接收者。向一个已经关闭的channelpanic。还要注意:channel与文件不同;通常情况关闭,例如中断一个`range`。packagepackageimportfuncfibonacci(nint,cchanint){x,y:=0,1fori:=0;i<n;i++{c<-xx,y=y,funcmain()c:=make(chanint,10)gofibonacci(cap(c),c)fori:=rangec{selectgoroutinepackagepackageimportfuncfuncfibonacci(c,quitchanint){x,y:=0,1forselectcasec<-x,y=y,case<-quit:funcmain()c:=make(chanint)quit:=make(chanint)gofunc(){fori:=0;i<10;i++{quit<-fibonacci(c,select中的其他条件分支都没有准备好的时候,`default`selectselectcasei:=<-i从cpackagepackageimportfuncmain()tick:=time.Tick(100*time.Millisecond)boom:=time.After(500*time.Millisecond)for{selectcase<-tick:case<-boom: time.Sleep(50*time.Millisecond)叉树保存了序列
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外贸代理服务协议(2025年客户信息保密)
- 2026年广东建设职业技术学院单招职业技能考试模拟试题带答案解析
- 2026年河南女子职业学院单招综合素质笔试备考试题带答案解析
- 2026年湖南劳动人事职业学院高职单招职业适应性测试备考试题有答案解析
- 投资合作分成合同协议2025年投资比例
- 2026年湖北水利水电职业技术学院单招综合素质笔试备考题库带答案解析
- 2026年广西物流职业技术学院单招职业技能笔试参考题库带答案解析
- 碳汇项目开发服务协议(林业)2025年合同书范本
- 税务代理服务协议2025年税务服务内容
- 2026年贵州应用技术职业学院单招综合素质考试备考试题带答案解析
- 2025年秋季第一学期学校语文教研组工作总结(二):携手教研之舟漫溯语文之河【课件】
- 初中历史区域国别研究教学与跨学科整合课题报告教学研究课题报告
- 档案工作责任追责制度
- 2024-2025学年重庆市南开中学七年级(上)期末道德与法治试卷(含答案)
- 【语文】广东省深圳市宝安区宝城小学二年级上册期末复习试题(含答案)
- 2025长影集团有限责任公司招聘3人笔试模拟试题及答案解析
- 2025西藏日喀则市萨迦县招聘专职网格员11人笔试备考题库及答案解析
- 节能工程监理质量评估报告范本
- 摄影取景角度课件
- 浙江省中医医疗技术感染预防与控制标准操作规程(试行)
- 2025年中国储备粮管理集团有限公司招聘笔试考点考试题库及答案
评论
0/150
提交评论