type
status
date
slug
summary
tags
category
icon
password
GO编程基础
环境搭建
解决sublime3搜索不到gosub插件
- 下载gosublime的zip包解压到路径C:\Users.....AppData\Roaming\Sublime Text 3\Packages,重命名为GoSublime
- 打开Browse Package的路径,在GoSublime/src目录下新建margo文件夹,把GoSublime/src/margo.sh/extension-example/extension/extension-example.go复制到该文件夹,并重命名为margo.go
基础知识
内置关键字
break、default、func、interface、selectcase、defer、go、map、structchan、else、goto、package、switchconst、fallthrough、if、range、typecontinue、for、import、return、var
注释方法
单行注释://
多行注释:/**/
导入package的格式
package别名
省略调用(不建议使用)
省略调用和别名不可同时使用,容易混淆且编译器无法识别
可见性规则
定义的常量、变量、类型、接口、结构、函数等的名称是大写字母开头表示能被其它包访问或调用(相当于public),非大写开头就只能在包内使用(相当于private,变量或常量也可以下划线开头)。
类型与变量
基本数据类型
布尔型:bool
整型:int/uint
字节型:byte(uint8)
16位整型:int16/uint16
32位整型:int32(rune)/uint32
64位整型:int64/uint64
浮点型:float32/float64
复数:complex64/complex128
其它值类型:array、struct、string
引用类型:slice、map、string
接口类型:interface
函数类型:func
类型零值
类型别名(一般类型声明)
多个变量的声明与赋值
全局变量的声明可使用 var() 的方式进行简写
全局变量的声明不可以省略 var,但可使用并行方式
所有变量都可以使用类型推断
局部变量不可以使用 var() 的方式简写,只能使用并行方式(即只能使用=号)
错误的声明
正确的声明
忽略符号
变量类型转换
<ValueA> [:]= <TypeOfValueA>(<ValueB>)
常量与运算符
枚举、常量的定义
运算符
&(与)
两位同时为1,结果为1
|(或)
其中一位为1,结果为1
^(异或)
两位为“异”,结果为1
&^
第二位为0,第一位为结果
第二位为1,第一位强制改0为结果
控制语句
if
for
- Go只有for一个循环语句关键字,但支持3种形式
- 初始化和步进表达式可以是多个值
- 条件语句每次循环都会被重新检查,因此不建议在条件语句中使用函数,尽量提前计算好条件并以变量或常量代替
- 左大括号必须和条件语句在同一行
无限循环
表达式判断
经典用法
for range(类似while和do-while循环)
slice
map
用法
取出的value是拷贝值
排序
switch
- 可以使用任何类型或表达式作为条件语句
- 不需要写break,一旦条件符合自动终止
- 如希望继续执行下一个case,需使用fallthrough语句
- 支持一个初始化表达式(可以是并行方式),右侧需跟分号
- 左大括号必须和条件语句在同一行
经典用法
跳转语句
- 三个语法都可以配合标签使用
- 标签名区分大小写,若不使用会造成编译错误
- break与continue配合标签可用于多层循环的跳出
- goto是调整执行位置,与其它2个语句配合标签的结果并不相同
定义标签
break
goto
continue
数组array
- 定义数组的格式:var <varName> [n]<type>,n>=0
- 数组长度也是类型的一部分,因此具有不同长度的数组为不同类型
- 注意区分指向数组的指针和指针数组
- 数组在Go中为值类型
- 数组之间可以使用==或!=进行比较,但不可以使用<或>
- 可以使用new来创建数组,此方法返回一个指向数组的指针
- Go支持多维数组
完全不同的两个类型数组
赋值
指向数组的指针
错误示例
正确示例
指针数组
new
多维数组
冒泡排序
切片slice
- 其本身并不是数组,它指向底层的数组
- 作为变长数组的替代方案,可以关联底层数组的局部或全部
- 为引用类型
- 可以直接创建或从底层数组获取生成
- 使用len()获取元素个数,cap()获取容量
- 一般使用make()创建
- 如果多个slice指向相同底层数组,其中一个的值改变会影响全部
- make([]T, len, cap)
- 其中cap可以省略,则和len的值相同
- len表示存数的元素个数,cap表示容量
区分数组和slice
用法
Reslice
- Reslice时索引以被slice的切片为准
- 索引不可以超过被slice的切片的容量cap()值
- 索引越界不会导致底层数组的重新分配而是引发错误
Append
- 可以在slice尾部追加元素
- 可以将一个slice追加在另一个slice尾部
- 如果最终长度未超过追加到slice的容量则返回原始slice
- 如果超过追加到的slice的容量则将重新分配数组并拷贝原始数据
slice长度超过最大容量时会翻倍
Copy
短的slice复制给长的slice
长的slice复制给短的slice
集合map
- 类似其它语言中的哈希表或者字典,以key-value形式存储数据
- Key必须是支持==或!=比较运算的类型,不可以是函数、map或slice
- Map查找比线性搜索快很多,但比使用索引访问数据的类型慢100倍
- Map使用make()创建,支持 := 这种简写方式
- make([keyType]valueType, cap),cap表示容量,可省略
- 超出容量时会自动扩容,但尽量提供一个合理的初始值
- 使用len()获取元素个数
- 键值对不存在时自动添加,使用delete()删除某键值对
- 使用 for range 对map和slice进行迭代操作
创建并初始化一个map
键值对map初始化用法
每一层map都需要初始化
函数function
- Go函数不支持嵌套、重载和默认参数
- 支持无需声明原型、不定长度变参、多返回值、命名返回值参数
- 匿名函数、闭包
- 定义函数使用关键字 func,且左大括号不能另起一行
- 函数也可以作为一种类型使用
传递值类型拷贝不影响值,传递指针才影响值
传递slice,地址拷贝影响值
匿名函数
闭包
defer
后定义先调用
painc、recover
结构struct
值拷贝用法
值修改用法
匿名结构
匿名字段
相同类型赋值
组合(嵌入结构)
匿名字段默认使用结构名称作为字段名称
方法method
指针传递类型修改值
方法绑定
接口interface
反射reflection
并发concurrency
- Author:always1ov
- URL:https://always1ov.com/article/Go%E7%BC%96%E7%A8%8B%E5%9F%BA%E7%A1%80
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!
Relate Posts
