您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > Golang语言介绍
云南易热网络科技开发有限公司智汇成就梦想激情责任创新Golang语言介绍Go编程语言是一个使得程序员更加有效率的开源项目。Go是有表达力、简洁、清晰和有效率的。它的并行机制使其很容易编写多核和网络应用,而新的类型系统允许构建有性的模块化程序。Go编译到机器码非常快速,同时具有便利的垃圾回收和强大的运行时反射。它是快速的、静态类型编译语言,但是感觉上是动态类型的,解释型语言。官方网址:背景及特点Go的前身来自于Inferno(基于贝尔实验室Plan9计划的改造)。Inferno包含了一个叫做Limbo的语言。这里引用了一段来自于Limbo论文的描述:Limbo是用于开发运行在小型计算机上的分布式应用的编程语言。它支持模块化编程,编译期和运行时的强类型检查,进程内基于具有类型的channel通讯,原子性垃圾收集,和简单的抽象数据类型。它被设计用于即便是没有硬件内存保护的小型设备上,也能安全的运行。1.命令词语言,非函数式语言;2.编译式语言,非解析式语言;3.强类型语言,非弱类型语言;4.带垃圾回收,多核并发语言;5.支持直接集成编译C语言库;6.天生集成通信管道channel;7.天生集成并发Go程(goroutine);8.支持面向对象编程,支持多根“继承”;9.支持反射,编译很快,执行也很快;10.跨平台语言,IOS、linux、Windows;11.完全开源,免费使用;Golang数据类型Go有众所周知的类型如int,这个类型根据你的硬件决定适当的长度。意味着32位硬件上,是32位的;在64位硬件上是64位的。注意:int是32或64位之一,不会定义成其他值。uint情况相同。如果你希望明确其长度,你可以使用int32或者uint32。完整的整数类型列表(符号和无符号)是int8,int16,int32,int64和byte,uint8,uint16,uint32,uint64。byte是uint8的别名。浮点类型的值有float32和float64(没有float类型)。64位的整数和浮点数总是64位的,即便是在32位的架构上。slice与array接近,但是在新的元素加入的时候可以增加长度。slice总是指向底层的一个array。1.整型:int8,int16,int,int32,int64;2.无符号整型:uint8,uint16,uint,uint32,uint64;3.浮点类型:float32,float644.字符串类型:string;5.数组类型:[]string,[]int//声明即可使用,无需创建6.切片类型:make([]int,10)7.map类型:make(map[string]string)8.布尔类型:bool;9.天生集成复数运算支持;10.支持指针,但不支持指针运算;11.可从上述类型中衍生定义自己的类型;变量定义及使用1.表达式末尾无需分号“;”;2.支持显示变量定义,即把变量定义和使用分开;3.支持直接使用定义,及把变量定义和使用合并;4.支持多赋值表达式复合使用;5.支持多变量返回,和舍去部分返回变量;6.运算符支持:*/%&&^+-|^==!===-&&--------------------------------------------显示定义|直接使用varaint|a:=15a=15|--------------------------------------------varbbool|b:=fasleb=false|--------------------------------------------多赋值表达式:a,b:=15,false--------------------------------------------多变量返回:returna,b返回变量忽略:c,_:=a,b程序控制结构(一)1.在Go中只有很少的几个控制结构c。例如这里没有do或者while循环,只有for。有if和switch语句,还有叫做“类型选择”和“多路通讯转接器”的select。2.if语句和C完全一样;3.Golang有goto语句——明智的使用它。用goto跳转到一定是当前函数内定义的标签。ifx0{|ifx:=6;x0{returny|returny}else{|}else{returnx|returnx}|}--------------------------------------------funcmyfunc(){i:=0Here:这行的第一个词,以分号结束作为标签println(i)i++gotoHere跳转}程序控制结构(二)1.Go的for循环有三种形式,只有其中的一种使用分号。在循环内支持break,continue,goto,return;①forinit;condition;post{}和C的for一样②forcondition{}和while一样③for{}和C的for(;;)一样(死循环)(其中break支持多层嵌套循环直接返回)fori:=1;i10;i++{//做想做的事情}----------------------------------------------for{//做想做的事情ifcondition{return}}----------------------------------------------list:=[]string{a,b,c,d,e,f}fork,v:=rangelist{//对k和v做想做的事情}程序控制结构(三)1.Go的switch非常灵活。表达式不必是常量或整数,执行的过程从上至下,直到找到匹配项,而如果switch没有表达式,它会匹配true。这产生一种可能,使用switch编写if-else-if-else判断序列。switchi{case0://空的case体case1:func1()//当i==0时,f不会被调用!default:func2()//默认分支}---------------------------------------------switch{case'0'=c&&c='9':returnc-'0‘case'a'=c&&c='f':returnc-'a'+10case'A'=c&&c='F':returnc-'A'+10}内建函数1.定义了少数函数,这意味着无需引用任何包就可以使用它们。closenewpaniccomplexdeletemakerecoverreallenappendprintimagcapcopyprintln1.close用于channel通讯。使用它来关闭channel。2.delete用于在map中删除实例。3.len和cap可用于不同的类型,len用于返回字符串、slice和数组的长度。4.new用于各种类型的内存分配。5.make用于内建类型(map、slice和channel)的内存分配copy用于复制slice。参阅本章的“slice”。6.append用于追加slice。7.panic和recover用于异常处理机制。8.array、slices和map199.print和println是底层打印函数,可以在不引入fmt包的情况下使用。它们主要用于调试。10.complex、real和imag全部用于处理复数函数定义及使用(一)typemytypeint新的类型func(pmytype)funcName(qint)(r,sint){return0,0}1234561.保留字func用于定义一个函数;2.函数可以定义用于特定的类型,这类函数更加通俗的称呼是method(这是可选的);3.funcnName是你函数的名字;4.int类型的变量q作为输入参数。参数用pass-by-value方式传递,意味着它们会被复制;5.变量r和s是这个函数的命名返回值。在Go的函数中可以返回多个值。如果不想对返回的参数命名,只需要提供类型:(int,int)。如果只有一个返回值,可以省略圆括号。如果函数是一个子过程,并且没有任何返回值,也可以省略这些内容;6.这是函数体,注意return是一个语句,所以包裹参数的括号是可选的。注:mytype大写字母开头表示,对包外公开,否者表示包内私有,方法名也是如此;函数定义及使用(二)1.在Go中,定义在函数外的变量是全局的,那些定义在函数内部的变量,对于函数来说是局部的。如果命名覆盖——一个局部变量与一个全局变量有相同的名字——在函数执行的时候,局部变量将覆盖全局变量。2.在左边中定义了函数q()的局部变量a。局部变量a仅在q()中可见。这也就是为什么代码会打印:656。在右边中没有定义局部变量,只有全局变量a。这将使得对a的赋值全局可见。这段代码将会打印:655。函数定义及使用(三)1.Golang没有trycatchfinal语句,但是提供了defer语句;可以将多个函数放入“延迟列表”中。2.延迟的函数是按照后进先出(LIFO)的顺序执行。3.defer可以使用(匿名)函数中,在该(匿名)函数中可以访问任何命名返回参数。4.同理Golang的异常处理也是用这个机制进行捕获的;funcReadWrite()bool{file.Open(file)deferfile.Close()//被添加到defer列表iffailureX{returnfalseClose()现在自动调用}iffailureY{returnfalse这里也是}returntrue}-------------------------------------------deferfunc(){//dosomething}()//()在这里是必须的恐慌(Panic)和恢复(Recover)1.Go没有像Java那样的异常机制:不能抛出一个异常。作为替代,它使用了恐慌和恢复(panic-and-recover)机制。2.一定要记得,这应当作为最后的手段被使用,你的代码中应当没有,或者很少的令人恐慌的东西。这是个强大的工具,明智的使用它。那么,应该如何使用它呢。functhrowsPanic(ffunc())(bbool){deferfunc(){ifx:=recover();x!=nil{b=true}}()//dosomethingreturn}源代码包1.包是函数和数据的集合。用package保留字定义一个包。文件名不需要与包名一致。包名的约定是使用小写字符。Go包可以由多个文件组成,但是使用相同的packagename这一行。2.在Go中,当函数的首字母大写的时候,函数会被从包中导出(在包外部可见,或者说公有的),因此函数Even是公有,函数odd是私有。packageeven-开始自定义的包import()-导入所需要的包funcEven(iint)bool{-可导出函数returni%2==0}funcodd(iint)bool{-私有函数returni%2==1}内存分配1.Go支持垃圾收集,也就是说无须担心已分配内存的回收问题。2.Go有两个内存分配原语,new和make。它们应用于不同的类型,做不同的工作,可能有些迷惑人,但是规则很简单。下面的章节展示了在Go中如何处理内存分配,并且希望能够让new和make之间的区别更加清晰。•new(T)分配了零值填充的T类型的内存空间,并且返回其地址,一个*T类型的值。用Go的术语说,它返回了一个指针,指向新分配的类型T的零值•回到内存分配。内建函数make(T,args)与new(T)有着不同的功能。它只能创建slice,map和channel,并且返回一个有初始值(非零)的T类型,而不是*T。typeSyncedBufferstruct{locksync.Mutexbufferbytes.Buffer}p:=new(SyncedBuffer)-执行后p已经可以使用varvSyncedBu
本文标题:Golang语言介绍
链接地址:https://www.777doc.com/doc-7252463 .html