go lang
文章平均质量分 76
freedomai
这个作者很懒,什么都没留下…
展开
-
go语言在linux平台上的搭建
go源码包在官网:golang.org下载,go分三类平台:window、freebsn、linxuLinux下go的环境变量设置:1.GOROOT该环境变量的值应该为Go语言的当前安装目录,例如:export GOROOT=/usr/local/go2.GOPATH该环境变量的值应该为Go语言的工作区的集合,例如:export GOPATH=~/gol原创 2016-03-21 22:55:06 · 569 阅读 · 0 评论 -
异常处理--error
Go语言的函数可以一次返回多个结果。这就温和地报告错误提供了语言级别的支持。实际上,这也是Go语言中处理错误的惯用法之一。先来回顾前一章的例子:func readFile(path string) ([]byte, error) { file, err := os.Open(path) if err != nil { return nil, err原创 2016-07-30 18:03:17 · 402 阅读 · 0 评论 -
异常处理--panic
在上一章,已经了解到了足够多的error接口及其周边的知识。现在,是学习另外一种异常处理方式的时候了。先来展示一个名词——panic。panic可被意译为运行时恐慌。因为它只有在程序运行的时候才会被“抛出来”。并且,恐慌是会被扩散的。当有运行时恐慌发生时,它会被迅速地向调用栈的上层传递。如果不显式地处理它的话,程序的运行瞬间就会被终止。这里有一个专有名词——程序崩溃。内建函数panic可以让人为地原创 2016-07-30 18:42:01 · 5180 阅读 · 0 评论 -
go语句初探
go语句和通道类型是Go语言的并发编程理念的最终体现。相比之下,go语句在用法上要比通道简单很多。与defer语句相同,go语句也可以携带一条表达式语句。注意,go语句的执行会很快结束,并不会对当前流程的进行造成阻塞或明显的延迟。一个简单的示例如下:go fmt.Println("Go!") 可以看到,go语句仅由一个关键字go和一条表达式语句构成。同样的,go语句的执行与其原创 2016-07-30 20:31:43 · 1234 阅读 · 0 评论 -
基础命令使用
基础命令:go run用于运行目录源码文件,只能接受一个命令源码文件以及若干个库源码文件作为文件参数-a:强制编译相关代码,不论它们的编译结果是否已是最新的-n:打印编译过程中所需运行的命令,但不真正执行它们-p n:并行编译,其中n为并行的数量-v:列出被编译的代码包的名称-work:显示编译时创建的临时工作目录的路径,并且不删除它-x:打印编译过程中所需运行的命原创 2016-07-20 20:57:06 · 235 阅读 · 0 评论 -
程序实体与关键字
任何Go语言源码文件都由若干个程序实体组成的。在Go语言中,变量、常量、函数、结构体和接口被统称为“程序实体”,而它们的名字被统称为“标识符”。 标识符可以是任何Unicode编码可以表示的字母字符、数字以及下划线“_”。不过,首字母不能是数字或下划线。 注意:在Go语言中,我们对程序实体的访问权限控制只能通过它们的名字来实现。名字首字母为大写的程序实体可以被任何代码包原创 2016-07-20 21:15:16 · 698 阅读 · 0 评论 -
变量和常量
在这里需要优先说明的是用于声明变量的关键字var,以及用于声明常量的关键字const。要知道,绝大多数的数据类型的值都可以被赋给一个变量,包括函数。而常量则不同,它只能被赋予基本数据类型的值本身。 变量和常量在声明方式方面也有所不同。可以在声明一个变量的时候直接为它赋值,也可以只声明不赋值。变量的声明并赋值方式如下:// 注释:普通赋值,由关键字var、变量名称、变量类型、原创 2016-07-20 22:54:55 · 257 阅读 · 0 评论 -
数组类型
一个数组(Array)就是一个可以容纳若干类型相同的元素的容器。这个容器的大小(即数组的长度)是固定的,且是体现在数组的类型字面量之中的。比如,我们声明了一个数组类型:type MyNumbers [3]int注:类型声明语句由关键字type、类型名称和类型字面量组成。 所谓类型字面量,就是用于表示某个类型的字面表示(或称标记方法)。相对的,用于表示某个类型的值的字面表原创 2016-07-21 20:47:16 · 545 阅读 · 0 评论 -
切片类型
切片(Slice)与数组一样,也是可以容纳若干类型相同的元素的容器。与数组不同的是,无法通过切片类型来确定其值的长度。每个切片值都会将数组作为其底层数据结构。我们也把这样的数组称为切片的底层数组。 表示切片类型的字面量如:[]int 或[]string 可以看到,它们与数组的类型字面量的唯一不同是不包含代表其长度的信息。因此,不同长度原创 2016-07-21 21:13:27 · 2779 阅读 · 0 评论 -
切片的更多操作方法
在进行“切片”操作的时候需要指定元素下界索引和元素上界索引,就像这样:numbers3[1:4] 在有些时候,还可以在方括号中放入第三个正整数,如下所示:numbers3[1:4:4] 这第三个正整数被称为容量上界索引。它的意义在于可以把作为结果的切片值的容量设置得更小。换句话说,它可以限制通过这个切片值对其底层数组中的更多元素的访问。下面举个例子。v原创 2016-07-21 21:39:46 · 1060 阅读 · 0 评论 -
defer语句
与select语句一样,Go语言中的defer语句也非常独特,而且比前者有过之而无不及。defer语句仅能被放置在函数或方法中。它由关键字defer和一个调用表达式组成。注意,这里的调用表达式所表示的既不能是对Go语言内建函数的调用也不能是对Go语言标准库代码包unsafe中的那些函数的调用。实际上,满足上述条件的调用表达式被称为表达式语句。请看下面的示例:func readFile(原创 2016-07-30 17:38:05 · 941 阅读 · 0 评论 -
基本规则
工作区和GOPATH工作区是放置Go源码文件的目录,一般情况下,Go源码文件都需要存放到工作区中,但是对于命令源码文件来说,这不是必须的src目录:用于存放源码文件,以代码包为组织形式pkg目录:用于存放归档文件(名称以.a为后缀的文件),所有归档文件都会被存放到该目录下的平台相关目录中,同样以代码包为组织形式平台相关目录:两个隐含的Go语言环境变量:G原创 2016-07-19 20:42:34 · 338 阅读 · 0 评论 -
select语句
select语句属于条件分支流程控制方法,不过它只能用于通道。它可以包含若干条case语句,并根据条件选择其中的一个执行。进一步说,select语句中的case关键字只能后跟用于通道的发送操作的表达式以及接收操作的表达式或语句。示例如下:ch1 := make(chan int, 1)ch2 := make(chan int, 1)// 省略若干条语句select {c原创 2016-07-30 10:42:58 · 413 阅读 · 0 评论 -
通道类型
通道(Channel)是Go语言中一种非常独特的数据结构。它可用于在不同Goroutine之间传递类型化的数据,并且是并发安全的。相比之下,之前介绍的那些数据类型都不是并发安全的。这一点需要特别注意。 Goroutine(也称为Go程序)可以被看做是承载可被并发执行的代码块的载体。它们由Go语言的运行时系统调度,并依托操作系统线程(又称内核线程)来并发地执行其中的代码块。至于怎样原创 2016-07-23 12:38:36 · 2272 阅读 · 0 评论 -
通道的更多类型
通道有带缓冲和非缓冲之分。缓冲通道中可以缓存N个数据。在初始化一个通道值的时候必须指定这个N。相对的,非缓冲通道不会缓存任何数据。发送方在向通道值发送数据的时候会立即被阻塞,直到有某一个接收方已从该通道值中接收了这条数据。非缓冲的通道值的初始化方法如下:make(chan int, 0) 注意,在这里,给予make函数的第二个参数值是0。 除了上述分类方法,原创 2016-07-23 13:20:19 · 572 阅读 · 0 评论 -
函数
在Go语言中,函数是一等(first-class)类型。这意味着,可以把函数作为值来传递和使用。函数代表着这样一个过程:它接受若干输入(参数),并经过一些步骤(语句)的执行之后再返回输出(结果)。特别的是,Go语言中的函数可以返回多个结果。 函数类型的字面量由关键字func、由圆括号包裹参数声明列表、空格以及可以由圆括号包裹的结果声明列表组成。其中,参数声明列表中的单个参数声明之原创 2016-07-23 13:58:26 · 289 阅读 · 0 评论 -
结构体和方法
Go语言的结构体类型(Struct)比函数类型更加灵活。它可以封装属性和操作。前者即是结构体类型中的字段,而后者则是结构体类型所拥有的方法。 结构体类型的字面量由关键字type、类型名称、关键字struct,以及由花括号包裹的若干字段声明组成。其中,每个字段声明独占一行并由字段名称(可选)和字段类型组成。示例如下:type Person struct { N原创 2016-07-23 19:49:16 · 680 阅读 · 0 评论 -
接口
在Go语言中,一个接口类型总是代表着某一种类型(即所有实现它的类型)的行为。一个接口类型的声明通常会包含关键字type、类型名称、关键字interface以及由花括号包裹的若干方法声明。示例如下:type Animal interface { Grow() Move(string) string} 注意,接口类型中的方法声明是普通的方法声明的简化形式。原创 2016-07-23 20:11:49 · 409 阅读 · 0 评论 -
指针
在前面多次提到过指针及指针类型。例如,*Person是Person的指针类型。又例如,表达式&p的求值结果是p的指针。方法的接收者类型的不同会给方法的功能带来什么影响?该方法所属的类型又会因此发生哪些潜移默化的改变?下面就来解答第一个问题。至于第二个问题,会在下一小节予以解答。 指针操作涉及到两个操作符——&和*。这两个操作符均有多个用途。但是当它们作为地址操作符出现时,前者的作原创 2016-07-24 09:53:43 · 289 阅读 · 0 评论 -
if语句
if语句一般会由关键字if、条件表达式和由花括号包裹的代码块组成。所谓代码块,即是包含了若干表达式和语句的序列。在Go语言中,代码块必须由花括号包裹。另外,这里的条件表达式是指其结果类型是bool的表达式。一条最简单的if语句可以是:if 100 > number { number += 3} 这里的标识符number可以代表一个int类型的值。这条if语句的原创 2016-07-24 12:18:09 · 472 阅读 · 0 评论 -
switch语句
与串联的if语句类似,switch语句提供了一个多分支条件执行的方法。不过在这里用一个专有名词来代表分支——case。每一个case可以携带一个表达式或一个类型说明符。前者又可被简称为case表达式。因此,Go语言的switch语句又分为表达式switch语句和类型switch语句。 先说表达式switch语句。在此类switch语句中,每个case会携带一个表达式。与if语句中原创 2016-07-25 21:25:09 · 2343 阅读 · 0 评论 -
for语句
for语句代表着循环。一条语句通常由关键字for、初始化子句、条件表达式、后置子句和以花括号包裹的代码块组成。其中,初始化子句、条件表达式和后置子句之间需用分号分隔。示例如下:for i := 0; i fmt.Print(i, " ")} 可以省略掉初始化子句、条件表达式、后置子句中的任何一个或多个,不过起到分隔作用的分号一般需要被保留下来,除非在仅有条原创 2016-07-28 23:51:58 · 1310 阅读 · 0 评论 -
字典类型
Go语言的字典(Map)类型其实是哈希表(Hash Table)的一个实现。字典用于存储键-元素对(更通俗的说法是键-值对)的无序集合。注意,同一个字典中的每个键都是唯一的。如果在向字典中放入一个键值对的时候其中已经有相同的键的话,那么与此键关联的那个值会被新值替换。 字典类型的字面量如下:map[K]T 其中,“K”意为键的类型,而“T”则代表元素原创 2016-07-21 23:04:49 · 3941 阅读 · 0 评论