收藏 分享(赏)

Golang语言介绍.ppt

上传人:精品资料 文档编号:10709894 上传时间:2019-12-29 格式:PPT 页数:20 大小:209.58KB
下载 相关 举报
Golang语言介绍.ppt_第1页
第1页 / 共20页
Golang语言介绍.ppt_第2页
第2页 / 共20页
Golang语言介绍.ppt_第3页
第3页 / 共20页
Golang语言介绍.ppt_第4页
第4页 / 共20页
Golang语言介绍.ppt_第5页
第5页 / 共20页
点击查看更多>>
资源描述

1、云南易热网络科技开发有限公司,智汇成就梦想 激情 责任 创新,Golang语言介绍,Go编程语言是一个使得程序员更加有效率的开源项目。Go是有表达力、简洁、清晰和有效率的。它的并行机制使其很容易编写多核和网络应用,而新的类型系统允许构建有性的模块化程序。Go编译到机器码非常快速,同时具有便利的垃圾回收和强大的运行时反射。它是快速的、静态类型编译语言,但是感觉上是动态类型的,解释型语言。,官方网址:http:/golang.org/,Golang背景及特点,Go的前身来自于Inferno(基于贝尔实验室Plan 9 计划的改造)。Inferno 包含了一个叫做Limbo的语言。这里引用了一段来自

2、于Limbo论文的描述: Limbo是用于开发运行在小型计算机上的分布式应用的编程语言。它支持模块化编程,编译期和运行时的强类型检查,进程内基于具有类型的channel通讯,原子性垃圾收集,和简单的抽象数据类型。它被设计用于即便是没有硬件内存保护的小型设备上,也能安全的运行。,命令词语言,非函数式语言; 编译式语言,非解析式语言; 强类型语言,非弱类型语言; 带垃圾回收,多核并发语言; 支持直接集成编译C语言库; 天生集成通信管道channel; 天生集成并发Go程(goroutine); 支持面向对象编程,支持多根“继承”; 支持反射,编译很快,执行也很快; 跨平台语言,IOS、linux、

3、Windows; 完全开源,免费使用;,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位的,即便是在

4、32位的架构上。 slice与array接近,但是在新的元素加入的时候可以增加长度。slice总是指向底层的一个array。,整型:int8,int16,int,int32,int64; 无符号整型:uint8,uint16,uint,uint32,uint64; 浮点类型:float32,float64 字符串类型:string; 数组类型:string,int/声明即可使用,无需创建 切片类型:make(int, 10) map类型:make(mapstringstring) 布尔类型:bool; 天生集成复数运算支持; 支持指针,但不支持指针运算; 可从上述类型中衍生定义自己的类型;,变

5、量定义及使用,表达式末尾无需分号“;”; 支持显示变量定义,即把变量定义和使用分开; 支持直接使用定义,及把变量定义和使用合并; 支持多赋值表达式复合使用; 支持多变量返回,和舍去部分返回变量; 运算符支持:* / % & &+ - | = != =-&,- 显示定义 | 直接使用 var a int | a:=15 a = 15 | - var b bool | b:=fasle b = false | - 多赋值表达式:a,b:=15,false - 多变量返回:return a,b 返回变量忽略:c,_ := a,b,程序控制结构(一),在Go中只有很少的几个控制结构c。例如这里没有do

6、或者while循环,只有for。有if和switch语句,还有叫做“类型选择”和“多路通讯转接器”的select。 if语句和C完全一样; Golang有goto语句明智的使用它。用goto跳转到一定是当前函数内定义的标签。,if x 0 |if x:=6;x 0 return y | return y else | else return x | return x | - func myfunc() i := 0Here: 这行的第一个词,以分号结束作为标签println(i)i+goto Here 跳转 ,程序控制结构(二),Go的for循环有三种形式,只有其中的一种使用分号。在循环内支持

7、break,continue,goto,return; for init; condition; post 和C 的for 一样 for condition 和while 一样 for 和C 的for(;) 一样(死循环) (其中break支持多层嵌套循环直接返回),for i:=1;i10;i+/做想做的事情 - for /做想做的事情if condition return - list := string“a“, “b“, “c“, “d“, “e“, “f“ for k, v := range list / 对k 和v 做想做的事情 ,程序控制结构(三),Go的switch非常灵活。表达

8、式不必是常量或整数,执行的过程从上至下,直到找到匹配项,而如果switch没有表达式,它会匹配true。这产生一种可能,使用switch编写if-else-if-else判断序列。,switch i case 0: / 空的case 体case 1:func1() / 当i = 0 时,f 不会被调用!default:func2() /默认分支 - switch case 0 = c & c = 9:return c - 0 case a = c & c = f:return c - a + 10 case A = c & c = F:return c - A + 10 ,内建函数,定义了少数

9、函数,这意味着无需引用任何包就可以使用它们。 close new panic complex delete make recover real len append print imag cap copy println,close 用于channel通讯。使用它来关闭channel。 delete 用于在map中删除实例。 len和cap 可用于不同的类型,len用于返回字符串、slice和数组的长度。 new 用于各种类型的内存分配。 make 用于内建类型(map、slice和channel)的内存分配copy 用于复制slice。参阅本章的“slice”。 append 用于追加sli

10、ce。 panic和recover 用于异常处理机制。 array、slices和map 19 print和println 是底层打印函数,可以在不引入fmt 包的情况下使用。它们主要用于调试。 complex、real和imag 全部用于处理复数,函数定义及使用(一),type mytype int 新的类型 func (p mytype) funcName(q int) (r,s int) return 0,0 1 2 3 4 5 6,保留字func用于定义一个函数; 函数可以定义用于特定的类型,这类函数更加通俗的称呼是method(这是可选的); funcnName 是你函数的名字; i

11、nt类型的变量q作为输入参数。参数用pass-by-value方式传递,意味着它们会被复制; 变量r和s是这个函数的命名返回值。在Go的函数中可以返回多个值。如果不想对返回的参数命名,只需要提供类型:(int,int)。如果只有一个返回值,可以省略圆括号。如果函数是一个子过程,并且没有任何返回值,也可以省略这些内容; 这是函数体,注意return是一个语句,所以包裹参数的括号是可选的。 注: mytype 大写字母开头表示,对包外公开,否者表示包内私有,方法名也是如此;,函数定义及使用(二),在Go中,定义在函数外的变量是全局的,那些定义在函数内部的变量,对于函数来说是局部的。如果命名覆盖一个

12、局部变量与一个全局变量有相同的名字在函数执行的时候,局部变量将覆盖全局变量。 在左边中定义了函数q()的局部变量a。局部变量a仅在q()中可见。这也就是为什么代码会打印:656。在右边中没有定义局部变量,只有全局变量a。这将使得对a的赋值全局可见。这段代码将会打印:655。,函数定义及使用(三),Golang没有try catch final 语句,但是提供了defer语句;可以将多个函数放入“延迟列表”中。 延迟的函数是按照后进先出(LIFO)的顺序执行。 defer可以使用(匿名)函数中,在该(匿名)函数中可以访问任何命名返回参数。 同理Golang的异常处理也是用这个机制进行捕获的;,f

13、unc ReadWrite() bool file.Open(“file“)defer file.Close() /被添加到defer 列表if failureX return false Close() 现在自动调用if failureY return false 这里也是return true - defer func() /do something () /() 在这里是必须的,恐慌(Panic)和恢复(Recover),Go没有像Java那样的异常机制:不能抛出一个异常。作为替代,它使用了恐慌和恢复(panic-and-recover)机制。 一定要记得,这应当作为最后的手段被使用,你

14、的代码中应当没有,或者很少的令人恐慌的东西。这是个强大的工具,明智的使用它。那么,应该如何使用它呢。,func throwsPanic(f func() (b bool) defer func() if x := recover(); x != nil b = true()/do somethingreturn ,源代码包,包是函数和数据的集合。用package保留字定义一个包。文件名不需要与包名一致。包名的约定是使用小写字符。Go包可以由多个文件组成,但是使用相同的package 这一行。 在Go中,当函数的首字母大写的时候,函数会被从包中导出(在包外部可见,或者说公有的),因此函数Even

15、是公有,函数odd是私有。,package even -开始自定义的包import () -导入所需要的包func Even(i int) bool -可导出函数return i % 2 = 0 func odd(i int) bool -私有函数return i % 2 = 1 ,内存分配,Go支持垃圾收集,也就是说无须担心已分配内存的回收问题。 Go有两个内存分配原语,new和make。它们应用于不同的类型,做不同的工作,可能有些迷惑人,但是规则很简单。下面的章节展示了在Go中如何处理内存分配,并且希望能够让new和make之间的区别更加清晰。 new(T)分配了零值填充的T类型的内存空间

16、,并且返回其地址,一个*T类型的值。用Go的术语说,它返回了一个指针,指向新分配的类型T的零值 回到内存分配。内建函数make(T, args)与new(T)有着不同的功能。它只能创建slice,map和channel,并且返回一个有初始值(非零)的T类型,而不是*T。,type SyncedBuffer struct lock sync.Mutexbuffer bytes.Buffer p := new(SyncedBuffer) -执行后p已经可以使用 var v SyncedBuffer -同上 - var p *int = new(int) -分配slice 结构内存; var v i

17、nt = make(int, 100)-v指向一个新分配的有100 个整数的数组。 var p *int = new(int) -不必要的复杂例子 *p = make(int, 100, 100) v := make(int, 100) -更常见 注:make仅适用于map,slice和channel,并且返回的不是指针;,Golang接口,在Go中,保留字interface 被赋予了多种不同的含义。每个类型都有接口,意味着对那个类型定义了方法集合。这段代码定义了具有一个字段和两个方法的结构类型S。 实际上,无须明确一个类型是否实现了一个接口意味着Go实现了叫做ducktyping的模式。这不

18、是纯粹的duck typing,因为如果可能的话Go编译器将对类型是否实现了接口进行实现静态检查。然而,Go确实有纯粹动态的方面,如可将一个接口类型转换到另一个。通常情况下,转换的检查是在运行时进行的。如果是非法转换当在已有接口值中存储的类型值不匹配将要转换到的接口程序会抛出运行时错误。 在Go中的接口有着与许多其他编程语言类似的思路:C+中的纯抽象虚基类,Haskell中的typeclasses 或者Python中的duck typing。然而没有其他任何一个语言联合了接口值、静态类型检查、运行时动态转换,以及无须明确定义类型适配一个接口。这些给Go带来的结果是,强大、灵活、高效和容易编写的

19、。,type S struct i int func (p *S) Get() int return p.i func (p *S) Put(v int) p.i = v type I interface Get() intPut(int) 对于接口I,S是合法的实现,因为它定义了I所需的两个方法。注意,即便是没有明确定义S实现了I,这也是正确的。,Golang并发(一),在这章中将展示Go使用channel和goroutine开发并行程序的能力。goroutine是一个普通的函数,只是需要使用保留字go作为开头。-输出结果- Im waiting 立刻 Coffee is ready! 1

20、秒后 Tea is ready! 2 秒后如果不等待goroutine的执行(例如,移除time.Sleep行),程序立刻终止,而任何正在执行的goroutine都会停止。为了修复这个,需要一些能够同goroutine通讯的机制。,ready(“Tea”, 2) -普通函数调用 go ready(“Tea“, 2) -作为goroutine运行 - func ready(w string, sec int) time.Sleep(time.Duration(sec) * time.Second)fmt.Println(w, “is ready!“) func main() go ready(“

21、Tea“, 2)go ready(“Coffee“, 1)fmt.Println(“Im waiting“)time.Sleep(5 * time.Second) ,Golang并发(二),上一个问题通过channels的形式使用。channel可以与Unix sehll中的双向管道做类比:可以通过它发送或者接收值。这些值只能是特定的类型:channel类型。定义一个channel时,也需要定义发送到channel的值的类型。注意,必须使用ma 【0】定义c作为int 型的channel。就是说:这个channel传输整数。注意这个变量是全局的,这样goroutine可以访问它; 【1】发送整

22、数1到channelc; 【2】初始化c; 【3】用保留字go开始一个goroutine; 【4】等待,直到从channel上接收一个值,注意收到的值被丢弃了; 【5】两个goroutines,接收两个值。 ke创建channel;,ci := make(chan int) cs := make(chan string) cf := make(chan interface) ci - 1 -发送整数1 到channel ci -ci -从channel ci 接收整数 i := -ci -从channel ci 接收整数,并保存到i中 - var c chan int 【0】 func ready(w string, sec int) time.Sleep(time.Duration(sec) * time.Second)fmt.Println(w, “is ready!“)c - 1 【1】 func main() c = make(chan int) 【2】go ready(“Tea“, 2) 【3】go ready(“Coffee“, 1)fmt.Println(“Im waiting, but not too long“)-c 【4】-c 【5】 ,智汇成就梦想,谢谢!,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报