-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
go 学习笔记 #7
Comments
条件语句if else跟Python一样,也可以嵌套。 switch 语句switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止。 switch 语句执行的过程从上至下,直到找到匹配项,匹配项后面也不需要再加 break。 switch 默认情况下 case 最后自带 break 语句,匹配成功后就不会执行其他 case,如果我们需要执行后面的 case,可以使用 fallthrough 。 switch 的 default 不论放在哪都是最后执行。 switch 中可以添加if语句,配合break进行终止。 select 语句select 是 Go 中的一个控制结构,类似于用于通信的 switch 语句。每个 case 必须是一个通信操作,要么是发送要么是接收。 select 随机执行一个可运行的 case。如果没有 case 可运行,它将阻塞,直到有 case 可运行。一个默认的子句应该总是可运行的。select 是随机执行的不是循环检测,是为了避免饥饿问题。 每个 case 都必须是一个通信。 |
循环语句go只有for,没有while。
函数定义格式如下:
parameter list和return_types都不是必须的,都是可选的。 默认情况下,Go 语言使用的是值传递,即在调用过程中不会影响到实际参数。 函数作为参数传递,实现回调。 闭包Go 语言支持匿名函数,可作为闭包。匿名函数是一个"内联"语句或表达式。匿名函数的优越性在于可以直接使用函数内的变量,不必申明。
方法法就是一个包含了接受者的函数,接受者可以是命名类型或者结构体类型的一个值或者是一个指针。所有给定类型的方法属于该类型的方法集。语法格式如下:
Go 没有面向对象,而我们知道常见的 Java。 变量作用域函数内定义的变量称为局部变量,函数外定义的变量称为全局变量,函数定义中的变量称为形式参数。 在函数体外声明的变量称之为全局变量,全局变量可以在整个包甚至外部包(被导出后)使用。 不同类型的局部和全局变量默认值为:int、float32为0,pointer为nil。 在 for 循环的 initialize(a:=0) 中,此时 initialize 中的 a 与外层的 a 不是同一个变量,initialize 中的 a 为 for 循环中的局部变量,因此在执行完 for 循环后,输出 a 的值仍然为 0。 |
数组语法格式如下:
与 c 语言不同,go 的数组作为函数参数传递的是副本,函数内修改数组并不改变原来的数组。 切片(Slice)切片是对数组的抽象。数组的长度不可改变,在特定场景中这样的集合就不太适用,Go 中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大。
一个切片在未初始化之前默认为 nil,长度为 0
可以通过设置起始和截止索引来设置截取切片。
切片,实际的是获取数组的某一部分,len切片<=cap切片<=len数组,切片由三部分组成:指向底层数组的指针、len、cap。
第一个字段表示 array 的指针,是真实数据的指针第二个是表示 slice 的长度,第三个是表示 slice 的容量。 当把 slice 作为参数,本身传递的是值,但其内容就 byte* array,实际传递的是引用,所以可以在函数内部修改,但如果对 slice 本身做 append,而且导致 slice 进行了扩容,实际扩容的是函数内复制的一份切片,对于函数外面的切片没有变化。
slice 的底层是数组指针,所以 slice a 和 b 指向的是同一个底层数组,所以当修改 s[0] 时,a 也会被修改。
建议:做 slice 截取时建议用两个参数,尤其是从底层数组进行切片操作时,因为这样在进行第一次 append 操作时,会给切片重新分配空间,这样减少切片对数组的影响。 结论:s = s[low : high : max] 切片的三个参数的切片截取的意义为 low 为截取的起始下标(含), high 为窃取的结束下标(不含 high),max 为切片保留的原切片的最大下标(不含 max);即新切片从老切片的 low 下标元素开始,len = high - low, cap = max - low;high 和 max 一旦超出在老切片中越界,就会发生 runtime err,slice out of range。另外如果省略第三个参数的时候,第三个参数默认和第二个参数相同,即 len = cap。max必须要大于等于high。
指针声明格式如下:
指针也可以作为函数的参数,形如 |
结构体
如果要访问结构体成员,需要使用点号 . 操作符,格式为:结构体.成员名。 struct 类似于 java 中的类,可以在 struct 中定义成员变量。
结构体中属性的首字母大小写问题
rangerange 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。
|
Map(集合)Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
如果不初始化 map,那么就会创建一个 nil map。nil map 不能用来存放键值对。
类型转换
接口主要目的是为了不同类型的数据提供统一的接口(方法)。
如果想要通过接口方法修改属性,需要在传入指针的结构体才行。
错误处理1、panic 在没有用 recover 前以及在 recover 捕获那一级函数栈,panic 之后的代码均不会执行;一旦被 recover 捕获后,外层的函数栈代码恢复正常,所有代码均会得到执行;
并发Go 语言支持并发,我们只需要通过 go 关键字来开启 goroutine 即可。
通道(channel)通道(channel)是用来传递数据的一个数据结构。
注意:默认情况下,通道是不带缓冲区的。发送端发送数据,同时必须有接收端相应的接收数据。 使用close(c chan)关闭通道,并不会丢失里面的数据,只是让读取通道数据的时候不会读完之后一直阻塞等待新数据写入
|
路径问题
GOROOT: GOROOT是Go的安装目录。Go安装程序会自动设置$GOROOT环境变量,一般不需要手动进行设置。
GOPATH:GOPATH目录是Go的工作目录,其中包含本地的项目文件,项目中引用的的第三方package,以及生成的二进制文件。
Go语言工具要求GOPATH的目录结构包含bin,pkg,src三个子目录。
安装依赖包时,多次提到过GOPATH。但是,因为改成vender模式进行包管理,现在已经不需要把项目放到GOPATH下了。
环境变量
执行
go env
可以查看目前go的所有环境变量。执行
go env -w key=value
可以设置环境变量的值。并且覆盖默认的设置go get超时
由于golang.org被墙,导致安装第三方库的时候经常超时。解决办法:设置代理。
数据类型
数字类型
Go 也有基于架构的类型,例如:int、uint 和 uintptr。
浮点型
其他数字类型
变量
Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。
单纯地给变量赋值也是不够的,这个值必须被使用。但是全局变量是允许声明但不使用的。
声明变量的一般形式是使用 var 关键字:
所有像 int、float、bool 和 string 这些基本类型都属于值类型,使用这些类型的变量直接指向存在内存中的值,你可以通过 &i 来获取变量 i 的内存地址。值类型变量的值存储在堆中。
其他更复杂的数据通常会需要使用多个字,这些数据一般使用引用类型保存。一个引用类型的变量 r1 存储的是 r1 的值所在的内存地址(数字),或内存地址中第一个字所在的位置。
这个内存地址称之为指针,这个指针实际上也被存在另外的某一个值中。
同一个引用类型的指针指向的多个字可以是在连续的内存地址中(内存布局是连续的),这也是计算效率最高的一种存储形式;也可以将这些字分散存放在内存中,每个字都指示了下一个字所在的内存地址。
当使用赋值语句 r2 = r1 时,只有引用(地址)被复制。
如果 r1 的值被改变了,那么这个值的所有引用都会指向被修改后的内容,在这个例子中,r2 也会受到影响。
如果你想要交换两个变量的值,则可以简单地使用 a, b = b, a,两个变量的类型必须是相同。
空白标识符 _ 也被用于抛弃值,如值 5 在:_, b = 5, 7 中被抛弃。
_ 实际上是一个只写变量,你不能得到它的值。这样做是因为 Go 语言中你必须使用所有被声明的变量,但有时你并不需要使用从一个函数得到的所有返回值。
并行赋值也被用于当一个函数返回多个返回值时,比如这里的 val 和错误 err 是通过调用 Func1 函数同时得到:val, err = Func1(var1)。
常量
常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。
常量无法修改,修改就报错。
常量可以用len(), cap(), unsafe.Sizeof()函数计算表达式的值。常量表达式中,函数必须是内置函数,否则编译不过。
在定义常量组时,如果不提供初始值,则表示将使用上行的表达式。
iota
iota,特殊常量,可以认为是一个可以被编译器修改的常量。
iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。
运算符
二元运算符的运算方向均是从左至右。由上至下代表优先级由高到低
优先级 | 运算符
5 | * / % << >> & &^
4 | + - | ^
3 | == != < <= > >=
2 | &&
1 | ||
The text was updated successfully, but these errors were encountered: