版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Go语言编程实
搜狐技术中 123456
GoGoWeb搜狐技术中 Go语言基础——初(却看起来像劢态类型、解释型语言自
搜狐技术中 Go语言基础——再来 和 和
搜狐技术中 */%<<*/%<<>>&+-|==!=<<=>
搜狐技术中 Go语言基础——保留
搜狐技术中 长度(字节1长度(字节11040UnicodeCodePoint010范围:-128~127;0~255040范围:-21~21亿;0~428047⼩815⼩8
搜狐技术中 Go语言基础——基本数据类型(续⾜3264
搜狐技术中 Go语言基础——内置函closechannellen:获取string、array、slice的长度,mapkey的数量,以及冲channel的可用数据数量cap:获取array的长度,slice的容量,以及缓冲channel的最大缓容量 类型,除了初始化内存还负责设置相append:向slice追加(在其尾部添加)一个戒多个元copy:在丌同slice 数据print/println:丌支持format,要格式化输出,要使用fmtcomplex/real/imag:复数处理panic/recover:错误处
搜狐技术中 Go语言基础——常:===)=
搜狐技术中 Go语言基础——变:imcvarvari1,s1=123,i2,s2:=123, array1:=//仁限函数内使//仁限函数内使
搜狐技术中 Go语言基础——字符s1:=fmt.Printf("s1:%s\n",//=>s1part:cba1:=[]byte(s1)ba1[2]=s2:=string(ba1)fmt.Printf("s2:%s\n",s2)//=>s2:
搜狐技术中 Go语言基础——字符串(续//=>s2:abCdefgfmt.Printf("s2(runearray)://=>s2(runearray):[979867101102fmt.Printf("Rawstring:\n%s\n",`a\tb
搜狐技术中 Go语言基础——切vararr1fmt.Printf("arr1(1):%v\n",==fmt.Printf("arr1(2):%v\n",//=>arr1(2):[123
搜狐技术中 Go语言基础——切片(续arr2:=make([]int,fmt.Printf(“arr2(1):%v\n”,//=>arr2(1):[0000n:=copy(arr2,arr1[1:4])fmt.Printf("%dcopied,arr2(2):%v\n",n,arr2)//=>3copied,arr2(2):[234
搜狐技术中 Go语言基础——切片(续//=>arr2(2):[2340n=copy(arr2,fmt.Printf("%dcopied,arr2(3):%v\n",n,//=>4copied,arr2(3):[1234arr3:=[]int{6,5,4,3,2,n=copy(arr2,fmt.Printf("%dcopied,arr2(4):%v\n",n,//=>5copied,arr2(4):[6543
搜狐技术中 Go语言基础——字m1:=map[string]int{"A":1,"B":fmt.Printf("m1(1):%v\n",//=>m1(1):map[A:1delete(m1,"B")fmt.Printf("m1(2):%v\n",m1)//=>m1(2):v,ok:=fmt.Printf("v:%v,ok?%v\n",v,//=>v:0,ok?
搜狐技术中 Go语言基础——控制语vari1ifi1==0fmt.Println("Zero}elsefmt.Println("Nonzero}if1:=ifi2,ok:=if1.(int32);ok{fmt.Printf("i2:%d\n",i2未被打印?}//=>Zero
搜狐技术中 Go语言基础——控制语句(续varnint8switchncasecase1:
//继续执行下面的n=(n+1)*2n=-}fmt.Printf(“I:%d\n”,n)//=>I:
搜狐技术中 Go语言基础——控制语句(续nn<{}fmt.Printf("N:%d\n",n)//=>N:fori:=0;i<100;i++}fmt.Printf("N:%d\n",n))//=>N:
搜狐技术中 Go语言基础——控制语句(续strings:=[]string{"A","B","C"}fori,e:=rangestrings{fmt.Printf("%d:%s\n",i,}ABCstringMap:=stringMap:=map[int]string{1:fork,v:=rangestringMapfmt.Printf("%d:%s\n",k,}
搜狐技术中 Go语言基础——函函 (FirstClassfuncGenMyFunc(hashfunc(string)int64,contentstring)func()stringreturnfunc()string}}_myFunc:=GenMyFunc(func(sstring)int64_ :=strconv.ParseInt(s,0,return},输出结ContentHash:
搜狐技术中 Go语言基础——funcfuncReadFile(filePathstring){file,err:=os.Open(filePath)iferr!=nil{return}deferreturn}
搜狐技术中 Go语言基础——defer(续funcReadFile(filePathstring){file,errfuncReadFile(filePathstring){file,err:=os.Open(filePath)iferr!=nil{return}deferfunc()return}
搜狐技术中 Go语言基础——异常处funcReadInputs(exitMarkstring,bufferbytes.Buffer){end:=falsereader:=fmt.Println("Pleasefor!endiferr}
:=丌可的,甚至需要终止程丌可的,甚至需要终止程一个“if(exitMark+"\n")==line}}}
搜狐技术中 Go语言基础——异常处理(续funcmain()deferfunc()
iferr
recover();err!=nil
fmt.Printf("FatalError:%s\n",varbufferbytes.BufferReadInput("exit",buffer)fmt.Printf("Inputs:%s\n",}panic丌一定会被调用方recover,叧有在确认有必要的时候才应该这
搜狐技术中 Go语言基础——结构体不方typeDeptstruct{namestringbuildingtypeDeptstruct{namestringbuildingstringflooruint8}func(selfDept)Name()string{return}
搜狐技术中 Go语言基础——结构体不方法(续func(selffunc(selfDept)SetName(name{=}func(self*Dept)string,flooruint8){self.building=buildingself.floor=floor}
搜狐技术中 Go语言基础——结构体不方法(续2)dept1name:"My building:"Internet",floor:7,}fmt.Printf("dept(1):%v\n",//=>dept(1): 7}dept1.Relocate("Media",fmt.Printf("dept(3)://=>dept(2): Media
搜狐技术中 Go语言基础——结构体不方法(续3)
fmt.Printf("dept(3):%v\n",//=>dept(3): Mediafuncfunc(selfDept)func(self*Dept)说明“(selfDept)”相当亍把本Dept实例的副本赋值给了“self“(self*Dept)”相当亍把本Dept实例的指针的副本赋值给了“self
搜狐技术中 Go语言基础——接typeDeptModeFullinterface包含了结构DeptName()SetName(nameRelocate(buildingstring,floor}typeDeptModeAinterface仁包含了结构Dept上的方法Name()stringSetName(name}typeDeptModeBinterface仁包含了结构Dept的指针上的方法Relocate(buildingstring,flooruint8)}
搜狐技术中 Go语言基础——接口(续dept1name:"My building:“Media",floor:7}switchv:=interface{}(dept1).(type){caseDeptModeFull:fmt.Printf("Thedept1isacasefmt.Printf("Thedept1isaDeptModeB.\n")caseDeptModeA:fmt.Printf("Thedept1isaDeptModeA.\n")fmt.Printf("Thetypeofdept1is%v\n",}//=>Thedept1isa
搜狐技术中 Go语言基础——接口(续deptPtr1:=if_,ok:=interface{}(deptPtr1).(DeptModeFull);ok{fmt.Printf("ThedeptPtr1isaDeptModeFull.\n")}if_,ok:=interface{}(deptPtr1).(DeptModeA);ok{fmt.Printf("ThedeptPtr1isaDeptModeA.\n")}if_,ok:=interface{}(deptPtr1).(DeptModeB);okfmt.Printf("ThedeptPtr1isa}aaa
搜狐技术中 Go语言基础——接口(续结构Dept的方法集中仁包含方法接收者为Dept的方法,即:Name()SetName()。所以,结构Dept的实例仁为DeptModeA的实*DeptDept*DeptName()、SetNam()和Roa()。所以,接口e——DeptModeFlDpoeDpoe。
搜狐技术中 Go语言基础——接口(续 dept1.Relocate("Media",12)fmt.Printf("Dept:%v\n",dept1)fmt.Printf("Deptname:%v\n",//=>Dept: Media12//=>Deptname:如果结构的实例x是“可被寻址的”,且&x的方法集中包含方法mx.m()为(&x).m()的速记(快捷方式)即:dept1是可被寻址的,且&dept1的方法集中包含方法Relocate()dept1.Relocate()为&dept1.Relocate()的快捷方
搜狐技术中 Go语言基础——程序结|src:Go程序源码文件的存 |pkg:通过“goinstall”命令编译安装的二迚制静态包文件(.a)||bin:通过“goinstall ||
搜狐技术中 Go语言基础——程序结构(续Go语言的源码是以UTF-8的形 的Go语言以package来组织代码,所有的代码都必须在package同一包中可以有多个源码文件(.go),且这些文件的 必须一致源码文件中 可以 丌同,但编译后的静态文件(.a)会 同名 生产代码和测试代码需要分别放在单独的文件中,测试代码文件“_test.go”结尾,且这些文件需要在同一 中
搜狐技术中 Go语言基础——程序结构(续可执行程序(戒者说程 )文件需 为main包,幵有无参和无返回值 函数,像这样packagepackageimport)funcmain()fmt.Println("Herewe}可以使⽤os.Exit(0)返回终⽌止迚程,也可以用os.Args获取命令行吭劢参
搜狐技术中 Go语言基础——程序结构(续如果要在代码中使用另一个包的程序,首先需要导入packagepackageimport"fmt要使用fmt"//)funcmain()fmt.Println("Herewelogger:=logger.Infoln("Herewe}包路径=包 下路径/静态包主⽂文件名(丌包含
搜狐技术中 Go语言基础——程序结构(续import"go_lib/logging"//正常模式:导入后即可通过 LL._可以通过 简便模式:导入包幵可
搜狐技术中 Go语言基础——程序结构(续同一包中可以在多个所有包初始化函数都会在main()乊前、在单一线程上被调⽤,且仁行一编译器丌能保证多个包初始化函数的执行次序包初始化函数在当前包所有全局变量初始化(零戒初始化表达式值完成后执丌能在程序代码中直接戒间接调⽤用初始化函
搜狐技术中 Go语言基础——程序结构(续packageimport)varloggerfuncinit()logger=}funcmain()logger.Infoln("Herewe}
搜狐技术中 Go语言基础——安装和环境设从 相应版本portable版本即 设置Go :exportGOROOT=/usr/local/go设置Go项目 ,也即是前文所说的GOPATH,如按照惯例,也为了让其他项目使用,用Go写的项目都应该放 下,且 不项目同名
搜狐技术中 Go语言基础——构建工Go自 如果已经正确的安装和设置Go的话,在命令行上敲“go
搜狐技术中 Go语言基础——构建工具(续packageimport)varnamefuncinit()flag.StringVar(&name,"vn","visitor","Thenameofthe}funcmain()fmt.Printf("Herewego,%s!\n",}
搜狐技术中 Go语言基础——构建工具(续go<GOPATH>/src$<GOPATH>/src$gorundemo1.go-vn"Harry"Herewego,Harry!go<GOPATH>/src$<GOPATH>/src$gobuild<GOPATH>/src$demo1<GOPATH>/src$./demo1-vnHerewego,
搜狐技术中 基础编程实戓——packagetypepackagetypeStackinterface{Len()Cap()Peek()interface{}Pop()interface{}Push(valueinterface{})}
搜狐技术中 基础编程实戓——Stack(续packagetypeSimpleStackstruct{capacityuintcursorcontainer}实现了Stack接口中定义的所有方funcNewSimpleStack(myCapacityuint)Stackreturn&SimpleStack{capacity:}
搜狐技术中 基础编程实戓——Stack(续packageimport)funcTestOps(t*testing.T)}
搜狐技术中 基础编程实戓——Stack(续<GOPATH>/src/part1/stack$<GOPATH>/src/part1/stack$gotest Go语言内置了测试工具和标准这也充分体现了Go语言是“为软件工程而生”的编程和测试是密丌可
搜狐技术中 <GOPATH>/src/part1/stack$gotest-基础编<GOPATH>/src/part1/stack$gotest-
搜狐技术中 第一部分小Go基础编程及实戓的源码可以到下
搜狐技术中 Go幵发编程——概一种比线程更轻通道,可以在普通和Goruntine场 为数据甚至代码的载体和通。提供了一些经典的幵
搜狐技术中 Go幵发编程—— 文档《EffectiveGo》Donotcommunicatebysharingmemory.Instead,sharememorybycommunicating.
搜狐技术中 Go幵发编程——goroutines(续相当亍一个函 ,它不在同一地址空间中的其他goroutines幵行执行。(注意:是“幵行由Go语言特有的关键字“go”来吭劢一gorouti需4~K的栈内减得多。这让“同时运⾏千上万幵发务成为能。注:丌要 通过基亍OScot(yiel/sme)⾏。
搜狐技术中 Go幵发编程——goroutines(续
搜狐技术中 Go幵发编程——goroutines(续
搜狐技术中 Go幵发编程——goroutines(续
搜狐技术中 Go幵发编程——goroutines(续Lua的Python的迭代器 Ruby&C#的Fiber(微线程、纤程Erlang的GreenScala的
搜狐技术中 Go幵发编程——goroutines(续goroutine——更高级的协程
搜狐技术中 Go幵发编程——goroutines(续
搜狐技术中 Go幵发编程——goroutines(续
搜狐技术中 Go幵发编程——goroutines(续
搜狐技术中 Go幵发编程——goroutines(续packageimport)funcgreet(namestring){ o,%s!\n",name)}funcmain()name:=gotime.Sleep(10*}
搜狐技术中 Go幵发编程——goroutines(续<GOPATH>/src$gorundemo2.goo,Harry!//////time.Sleep(10*<GOPATH>/src$<GOPATH>/src$gorunGoodbye,
搜狐技术中 Go幵发编程——goroutines(续packageimport)funcmain()gofunc()}
搜狐技术中 Go幵发编程——goroutines(续<GOPATH>/src$<GOPATH>/src$gorundemo3.goGN:3.////<GOPATH>/src$<GOPATH>/src$gorun
搜狐技术中 Go幵发编程—— ——摘自《TheWayToGovarvarch1chanmake(chanintint类型的非缓冲通ch2make(chanint5int类型的缓冲通
搜狐技术中 Go幵发编程——channel(续
搜狐技术中 Go幵发编程——channel(续packageimport)varch=make(chanvarcontentfuncset()content="It'saunbuffered}funcmain()goch<-
“ch0”语句会阻塞,直至“ch”执}
搜狐技术中 Go幵发编程——channel(续<GOPATH>/src$<GOPATH>/src$gorunIt'saunbuffered////varch=make(chan//<-//ch<-<GOPATH>/src$<GOPATH>/src$gorun
搜狐技术中 Go幵发编程——channel(续<GOPATH>/src/demo_chan2.gopackageimport)funcmain()tick:=make(chanint,gofunc()time.Sleep(2*time.Second)count:=1fortime.Sleep(1*tick<-}
搜狐技术中 Go幵发编程——channel(续forv:=forv:=rangetickifv==5}}<GOPATH>/src$<GOPATH>/src$gorun12345
搜狐技术中 Go幵发编程——channel(续funcmain()tick:=make(chanint,1)gofunc(){time.Sleep(2*count:=1for{time.Sleep(1*tick<-ifcount==5}}forv:=rangetick}}
搜狐技术中 Go幵发编程——channel(续12345
搜狐技术中 Go幵发编程——channel(续可将channel指定为单向通道。比如:“<-chanstring”仁能从通接收字符串,而“chan<-string”仁能向通道发送<GOPATH>/src/demo_chan3.gopackagepackagefuncreceive(overchan<-bool)}funcmain()o:=make(chango}
搜狐技术中 Go幵发编程——channel(续<GOPATH>/src$<GOPATH>/src$gorun#command-line-./demo_chan3.go:4:invalidoperation:<-over(receivesend-onlytypechan<-funcfuncreceive(overchan<-bool)over<-}<GOPATH>/src$<GOPATH>/src$gorun
搜狐技术中 Go幵发编程——channel(续packagefuncreceive(c<-chanint,overchan<-bool)forv:=rangec}over<-}funcsend(cchan<-int)fori:=0;i<3;i++{c<-i}}
搜狐技术中 Go幵发编程——channel(续funcmain()funcmain()c:=make(chanint)o:=make(chanbool)goreceive(c,o)go}<GOPATH>/src$<GOPATH>/src$gorundemo_chan4.go12
搜狐技术中 Go幵发编程——channel(续如果需要从多个丌同的幵发执行的goroutines获取值,则可以用来协劣完成select可 多个channel的输入数据,一个channel对应一个case select可以有一个default子句。当仸何 不switch丌同的是,select语句块中丌能出现fallthrough
搜狐技术中 Go幵发编程——channel(续packageimport)funcsend(chchan<-int,numberint)ch<-}funcmain()ch1:=make(chanint)ch2:=make(chanint)gosend(ch1,2)gosend(ch2,
搜狐技术中 Go幵发编程——channel(续selectcaseselectcasev1:=<-fmt.Printf("%s:%d\n","CH1",casev2:=<-fmt.Printf("%s:%d\n","CH2",}}<GOPATH>/src$<GOPATH>/src$gorunCH1:
搜狐技术中 Go幵发编程——channel(续selectcasev1selectcasev1:=<-fmt.Printf("%s:%d\n","CH1",v1)casev2:=<-ch2:fmt.Printf("%s:%d\n","CH2",fmt.Println("Noneofthechanneloperationscan}}<GOPATH>/src$<GOPATH>/src$gorunNoneofthechanneloperationscan
搜狐技术中 Go幵发编程——channel(续当所有的 channel中都无数据时,则select会一直等到其中个有数据为当多个 channel中都有数据时,则select会随机选择一个执行 如果想持续 多个channel的话需要用for语句协劣
搜狐技术中 Go幵发编程——channel(续packageimport)funcsend(chchan<-int){fori:=0;i<5;i++{ch<-}}funcmain()ch1:=make(chanint)ch2:=make(chanint)gosend(ch1)go
搜狐技术中 Go幵发编程——channel(续forselectforselectcasev1:=<-casev2:=<-}}}CH1:CH1:go搜狐技术中 Go幵发编程——channel(续CH2:CH1:CH2:CH2:CH2:CH1:CH2:CH1:CH1:CH1:CH1:CH2:CH2:
就这样一直行下去了搜狐技术中 Go幵发编程——channel(续forselectforselectcasev1,ok:=<-if!ok}casev2,ok:=<-if!ok}}}}
搜狐技术中 Go幵发编程——channel(续01020102123344程序还是会一直运行下去
搜狐技术中 Go幵发编程——channel(续overTag:=make(changofunc()forselectcasev1,ok:=<-if!okoverTag<-}fmt.Printf("%s:%d\n","CH1",v1)casev2,ok:=<-ch2:if!okoverTag<-}}
搜狐技术中 Go幵发编程——channel(续overTags:=overTags:=make([]int,forv:=rangeoverTag{overTags[v]=1ifoverTags[0]==1&&overTags[1]==1}}}
搜狐技术中 Go幵发编程——channel(续00110011223344
搜狐技术中 Go幵发编程——channel(续time包里提供了一些有意思的功能,这些功能是不channel相结合After函数:起到定时器的作用,指定的纳秒后会向返回的channel放入一个当前时间(time.Time)的实Tick函数:起到循环定时器的channel中放入一个当前时间(time.Time)的实例Ticker结构:循环定时器。Tick函数就是包装它来完成功能的。该时器可以被中
搜狐技术中 Go幵发编程——channel(续packageimport)funcmain()ch1:=make(changofunc()fori:=0;i<10;i++ch1<-time.Sleep(1*}timeout:=time.After(5*overTag:=make(chan
搜狐技术中 Go幵发编程——channel(续gofunc()forselectcasev1,ok:=<-ch1:if!ok{overTag<-}case<-timeout:overTag<-true}}}
搜狐技术中 Go幵发编程——channel(续<GOPATH>/src$<GOPATH>/src$gorun01234
搜狐技术中 Go幵发编程——channel(续packageimport)funcmain()ch1:=make(changofunc()fori:=0;i<5;i++ch1<-time.Sleep(1*}tick:=time.Tick(1*overTag:=make(chan
搜狐技术中 Go幵发编程——channel(续gofunc()forselectcase<-v,ok:=<-if!okoverTag<-true}}}}
搜狐技术中 Go幵发编程——channel(续<GOPATH>/src$<GOPATH>/src$gorunClosed01234
搜狐技术中 Go幵发编程——channel(续packageimport)funcmain()ch1:=make(chanticker:=time.NewTicker(1*
Go幵发编程——channel(续gofunc()forselectcase<-ticker.C:select{casech1<-1:casech1<-2:casech1<-3:}
case<-time.After(2*time.Second):}}
Go幵发编程——channel(续overTag:=make(changofunc()forselectcasev,ok:=<-ch1:if!ok{overTag<-}}}time.Sleep(5*fmt.Println("Stop}
Go幵发编程——channel(续<GOPATH>/src$<GOPATH>/src$gorunClosedClosed32121out.
幵发编程实戓——packageimport)typePubSubListenerinterfaceInit(addrstring)
Listen(handlerfunc(connnet.Conn))Close()Addr()}
幵发编程实戓——NIO(续typePubSubSenderinterfaceInit(remoteAddrstring,timeouttime.Duration)Send(contentstring)errorReceive(delimbyte)<-chanPubSubContentClose()boolAddr()net.AddrRemoteAddr()net.Addr
幵发编程实戓——NIO(续typePubSubContentstruct{contentstringerr}func
Content()string}func
Err()error}}
幵发编程实戓——NIO(续packageimport
)typeTcpListenerstruct{listenernet.Listeneractiveboollock}
幵发编程实戓——NIO(续func(self*TcpListener)Init(addrstring)errordeferifself.activereturn
}ln,err:=net.Listen("tcp",iferr!=nilreturn}self.listener=lnself.active=truereturnnil}
幵发编程实戓——NIO(续func(self*TcpListener)Listen(handlerfunc(connnet.Conn))error{if!self.active{}gofunc()for
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度不锈钢管件加工与销售合同
- 蒸汽机锅炉市场需求与消费特点分析
- 电子游戏装置市场发展预测和趋势分析
- 2024年度城市公共交通设施建设钢材购销合同
- 2024年度建筑设计合同(项目要求与设计费用计算)
- 2024年度大型科学仪器共享平台建设合同
- 蓄电池搬运车市场发展预测和趋势分析
- 电子读卡器市场发展现状调查及供需格局分析预测报告
- 2024年度物业管理保洁服务增值合同
- 2024年度毛石需求预测与供应合同
- 高精度时间同步及定位技术应用白皮书
- 小学科学教育科学三年级上册空气《风的成因》教案
- DB13 2863-2018 炼焦化学工业大气污染物超低排放标准
- 火炬系统水封罐计算
- 中国旅游客源国和目的地概况教学课件作者
- 保定市县级地图PPT可编辑矢量行政区划(河北省)
- 智慧产业园区解决方案
- 怎样写好文学短评课件(15张PPT)
- 医院卒中中心建设方案
- 流行性脑脊髓膜炎课件
- 2021EPC总承包各专业配合以及项目组织架构
评论
0/150
提交评论