golang学习
go语言主要特性
- 自动垃圾回收
- 更丰富的内置类型
- 函数多返回值
- 错误处理
- 匿名函数和闭包
- 类型和接口
- 并发编程
- 反射
- 语言交互性
go基础
包声明
package,每个go应用程序都包含一个名为main的包
引入包
import
函数
func,main函数是每一个可执行程序必须包含的,一般是启动后第一个执行的,如果有init()函数会先执行该函数
变量
语句 & 表达式
注释
注意:当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识符如果以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的 protected )。
{必须当在函数后面,不能另起一行。
每个分局不用;结尾,但是多个语句在同一行需要;分割
变量的声明必须用空格隔开
go数据类型
布尔类型:var a bool
数字类型:int,float32,float64,支持整型和浮点型数字,并且支持复数,其中位的运算采用补码
字符串类型:由单个字符连接起来的,字符串的字节使用utf-8编码标识unicode文本
派生类似:
- 指针类型(Pointer)
- 数组类型
- 结构化类型(struct)
- Channel类型
- 函数类型
- 切片类型
- 接口类型(interface)
- Map类型
go变量和常量
变量:var关键字,
可以将 var f string = “Runoob” 简写为 f := “Runoob”这是使用变量的首选形式,但是它只能被用在函数体内,而不可以用于全局变量的声明与赋值。使用操作符 := 可以高效地创建一个新的变量,称之为初始化声明。
如果在相同的代码块中,我们不可以再次对于相同名称的变量使用初始化声明,编译器会提示错误 no new variables on left side of :=,但是重新赋值 是可以的,因为这是给相同的变量赋予一个新的值。
如果你声明了一个局部变量却没有在相同的代码块中使用它,同样会得到编译错误,但是全局变量是允许声明但不使用的
并行 或 同时 赋值。如果你想要交换两个变量的值,则可以简单地使用 a, b = b, a,两个变量的类型必须是相同。
空白标识符 _ 也被用于抛弃值,如值 5 在:, b = 5, 7 中被抛弃。空白标识符 _ 也被用于抛弃值,如值 5 在:, b = 5, 7 中被抛弃。
并行赋值也被用于当一个函数返回多个返回值时,比如这里的 val 和错误 err 是通过调用 Func1 函数同时得到:val, err = Func1(var1)。
常量:const
iota,特殊常量,可以认为是一个可以被编译器修改的常量。
iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。
也就是默认常量不声明就为行索引,上一行有赋值和上一行赋值一样
go数组
数组的大小是类型的一部分,因此不同大小的数组是不兼容的,也就是说[5]int和[10]int是不同的类型
如果数组长度不确定,可以使用…代替数组的长度,编译器会根据元素个数自行推断数组的长度
如果设置了数组的长度,我们还可以通过指定下标来初始化元素
balance:=[5]float32{1:2.0,3:7.0}
go结构体
结构体定义使用type和struct语句
type struct_variable_type struct {
member definition
member definition
...
member definition
}
go切片
内置类型切片(动态数组),与数组相比切片的长度不固定,可以追加元素,在追加时可能使切片的容量增大
可以声明一个未指定大小的数组来定义切片
var a []type
或使用make()来创建切片
var s []type=make([]type,len)
s:=make([]type,len)
slice底层包含
type slice struct {
array unsafe.Pointer // 数组指针
len int // slice长度,len函数
cap int // slice容量
}
slice的扩容
在1.18之后,growslice函数改为当大小小于256,双倍扩容,当大于256,扩容后容量=1.25倍容量+192
这样为了使得内存扩容更平滑 比如256*1.5+192=512 临界处更平滑,这样内存扩容就是单调递增的。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。