Golang基础
2020-08-06 09:54:14 125 举报
AI智能生成
Golang,又称Go语言,是由Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。它的语法与C相近,但功能上有:内存安全,GC(垃圾回收),结构形态及CSP-style并发计算。Go语言的吉祥物是名为“Go”的小鸟,寓意着迅速和高效。Go语言在软件构建、网络编程、并发处理等领域表现出色,被广泛应用于云计算、大数据处理、微服务架构等场景。
作者其他创作
大纲/内容
环境安装
下载地址: https://studygolang.com/dl
设置环境变量
Windows :<br>GOROOT 安装路径 <br>GOPATH 代码工作区路径 <br>GOPROXY 包下载代理地址
Linux : <br>export GOPROXY=https://goproxy.cn<br>export GOROOT=/data/go<br>export GOPATH=/data/gocode<br>export PATH=$GOROOT/bin:$GOPATH/bin:$PATH
测试环境
执行命令: go env
基础语法
Go 程序可以由多个标记组成,可以是关键字,标识符,常量,字符串,符号
变量
Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。<br>声明变量的一般形式是使用 var 关键字: var xxx 数据类型 = xxx
变量声明<br>第一种,指定变量类型,如果没有初始化,则变量默认为零值: var v_name v_type v_name = value<br>第二种,根据值自行判定变量类型:var v_name = value<br>第三种,省略 var, 注意 := 左侧如果没有声明新的变量,就产生编译错误,格式: v_name := value<br>
常量
常量是一个简单值的标识符,在程序运行时,不会被修改的量。<br>常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型。<br>常量的定义格式: const identifier [type] = value<br>
iota<br>iota,特殊常量,可以认为是一个可以被编译器修改的常量。<br>iota 在 const关键字出现时将被重置为 0(const 内部的第一行之前),<br>const 中每新增一行常量声明将使 iota 计数一次(iota 可理解为 const 语句块中的行索引)。
数据类型
数字类型
整型
<b>uint8<br>无符号 8 位整型 (0 到 255)</b>
<b>uint16<br>无符号 16 位整型 (0 到 65535)</b>
<b>uint32<br>无符号 32 位整型 (0 到 4294967295)</b>
<b>uint64<br>无符号 64 位整型 (0 到 18446744073709551615)</b>
<b>int8<br>有符号 8 位整型 (-128 到 127)</b>
int16<br>有符号 16 位整型 (-32768 到 32767)
int32<br>有符号 32 位整型 (-2147483648 到 2147483647)
int64<br>有符号 64 位整型 (-9223372036854775808 到 9223372036854775807)
浮点型
float32<br>IEEE-754 32位浮点型数
float64<br>IEEE-754 64位浮点型数
complex64<br>32 位实数和虚数
complex128<br>64 位实数和虚数
其他数字类型
byte 类似 uint8
rune 类似 int32
uint 32 或 64 位
int 与 uint 一样大小
uintptr 无符号整型,用于存放一个指针
布尔型
常量 true 或 false
字符串类型
字符串就是一串固定长度的字符连接起来的字符序列
派生类型
(a) 指针类型(Pointer)<br><br>(b) 数组类型<br><br>(c) 结构化类型(struct)<br><br>(d) Channel 类型<br><br>(e) 函数类型<br><br>(f) 切片类型<br><br>(g) 接口类型(interface)<br><br>(h) Map 类型
运算符
算术元运算符
+ 相加 A + B 输出结果 30<br>- 相减 A - B 输出结果 -10<br>* 相乘 A * B 输出结果 200<br>/ 相除 B / A 输出结果 2<br>% 求余 B % A 输出结果 0<br>++ 自增 A++ 输出结果 11<br>-- 自减 A-- 输出结果 9
关系运算符
== 检查两个值是否相等,如果相等返回 True 否则返回 False。 (A == B) 为 False<br>!= 检查两个值是否不相等,如果不相等返回 True 否则返回 False。 (A != B) 为 True<br>> 检查左边值是否大于右边值,如果是返回 True 否则返回 False。 (A > B) 为 False<br>< 检查左边值是否小于右边值,如果是返回 True 否则返回 False。 (A < B) 为 True<br>>= 检查左边值是否大于等于右边值,如果是返回 True 否则返回 False。 (A >= B) 为 False<br><= 检查左边值是否小于等于右边值,如果是返回 True 否则返回 False。 (A <= B) 为 True
逻辑运算符
&& 逻辑 AND 运算符。 如果两边的操作数都是 True,则条件 True,否则为 False。 (A && B) 为 False<br>|| 逻辑 OR 运算符。 如果两边的操作数有一个 True,则条件 True,否则为 False。 (A || B) 为 True<br>! 逻辑 NOT 运算符。 如果条件为 True,则逻辑 NOT 条件 False,否则为 True。 !(A && B) 为 True
位运算符
& 按位与运算符"&"是双目运算符。 其功能是参与运算的两数各对应的二进位相与。 (A & B) 结果为 12, 二进制为 0000 1100<br>| 按位或运算符"|"是双目运算符。 其功能是参与运算的两数各对应的二进位相或 (A | B) 结果为 61, 二进制为 0011 1101<br>^ 按位异或运算符"^"是双目运算符。 其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。 (A ^ B) 结果为 49, 二进制为 0011 0001<br><< 左移运算符"<<"是双目运算符。左移n位就是乘以2的n次方。 其功能把"<<"左边的运算数的各二进位全部左移若干位,由"<<"右边的数指定移动的位数,高位丢弃,低位补0。 A << 2 结果为 240 ,二进制为 1111 0000<br>>> 右移运算符">>"是双目运算符。右移n位就是除以2的n次方。 其功能是把">>"左边的运算数的各二进位全部右移若干位,">>"右边的数指定移动的位数。 A >> 2 结果为 15 ,二进制为 0000 1111
赋值运算符
= 简单的赋值运算符,将一个表达式的值赋给一个左值 C = A + B 将 A + B 表达式结果赋值给 C<br>+= 相加后再赋值 C += A 等于 C = C + A<br>-= 相减后再赋值 C -= A 等于 C = C - A<br>*= 相乘后再赋值 C *= A 等于 C = C * A<br>/= 相除后再赋值 C /= A 等于 C = C / A<br>%= 求余后再赋值 C %= A 等于 C = C % A<br><<= 左移后赋值 C <<= 2 等于 C = C << 2<br>>>= 右移后赋值 C >>= 2 等于 C = C >> 2<br>&= 按位与后赋值 C &= 2 等于 C = C & 2<br>^= 按位异或后赋值 C ^= 2 等于 C = C ^ 2<br>|= 按位或后赋值 C |= 2 等于 C = C | 2
其他运算符
& 返回变量存储地址 &a; 将给出变量的实际地址。<br>* 指针变量。 *a; 是一个指针变量
运算符优先级
优先级 运算符<br>5 * / % << >> & &^<br>4 + - | ^<br>3 == != < <= > >=<br>2 &&<br>1 ||
流程控制
if 语句 if 语句 由一个布尔表达式后紧跟一个或多个语句组成。<br>if...else 语句 if 语句 后可以使用可选的 else 语句, else 语句中的表达式在布尔表达式为 false 时执行。<br>if 嵌套语句 你可以在 if 或 else if 语句中嵌入一个或多个 if 或 else if 语句。
switch 语句 switch 语句用于基于不同条件执行不同动作。<br>select 语句 select 语句类似于 switch 语句,但是select会随机执行一个可运行的case。<br>如果没有case可运行,它将阻塞,直到有case可运行。
for
Go 语言的 For 循环有 3 种形式,只有其中的一种使用分号。<br>1、和 C 语言的 for 一样:<br> for init; condition; post { }<br>2、和 C 的 while 一样:<br> for condition { }<br>3、和 C 的 for(;;) 一样:<br> for { }<br><br>init: 一般为赋值表达式,给控制变量赋初值;<br>condition: 关系表达式或逻辑表达式,循环控制条件;<br>post: 一般为赋值表达式,给控制变量增量或减量。<br>
for语句执行过程如下:<br>1、先对表达式 1 赋初值;<br>2、判别赋值表达式 init 是否满足给定条件,若其值为真,满足循环条件,<br>则执行循环体内语句,然后执行 post,进入第二次循环,再判别 condition;<br>否则判断 condition 的值为假,不满足条件,就终止for循环,执行循环体外语句。
for 循环的 range 格式可以对 slice、map、数组、字符串等进行迭代循环。格式如下:<br>for key, value := range oldMap {<br> newMap[key] = value<br>}<br>Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。<br>在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对。<br>
break 语句 经常用于中断当前 for 循环或跳出 switch 语句<br>continue 语句 跳过当前循环的剩余语句,然后继续进行下一轮循环。<br>goto 语句 将控制转移到被标记的语句。
函数 Func
函数是基本的代码块,用于执行一个任务。<br>Go 语言最少有个 main() 函数。
Go 语言函数定义格式如下:<br>func function_name( [parameter list] ) [return_types] {<br> 函数体<br>}<br>函数定义解析:<br>func:函数由 func 开始声明<br>function_name:函数名称,函数名和参数列表一起构成了函数签名。<br>parameter list:参数列表,参数就像一个占位符,当函数被调用时,你可以将值传递给参数,这个值被称为实际参数。<br>参数列表指定的是参数类型、顺序、及参数个数。参数是可选的,也就是说函数也可以不包含参数。<br>return_types:返回类型,函数返回一列值。return_types 是该列值的数据类型。<br>有些功能不需要返回值,这种情况下 return_types 不是必须的。<br>函数体:函数定义的代码集合。
函数参数<br>函数如果使用参数,该变量可称为函数的形参;形参就像定义在函数体内的局部变量。<br>调用函数,可以通过两种方式来传递参数:<br><br><b>值传递</b> 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。<br><b>引用传递</b> 引用传递是指在调用函数时将实际参数的地址传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。<br>默认情况下,<b><u>Go 语言使用的是值传递</u></b>,即在调用过程中不会影响到实际参数。
变量作用域 <br>Go 语言中变量可以在三个地方声明:<br>函数内定义的变量称为局部变量<br>函数外定义的变量称为全局变量<br>函数定义中的变量称为形式参数<br>
局部变量: <br>在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,参数和返回值变量也是局部变量。
全局变量<br>在函数体外声明的变量称之为全局变量,全局变量可以在整个包甚至外部包(被导出后)使用。<br>全局变量可以在任何函数中使用
形式参数<br>形式参数会作为函数的局部变量来使用
数组 Array
数组是具有相同唯一类型的一组已编号且长度固定的数据项序列,这种类型可以是任意的原始类型例如整形、字符串或者自定义类型。
声明数组<br>Go 语言数组声明需要指定元素类型及元素个数,语法格式如下:<br>var variable_name [SIZE] variable_type<br>以上为一维数组的定义方式。例如以下定义了数组 balance 长度为 10 类型为 float32:<br>var balance [10] float32
初始化数组<br>以下演示了数组初始化:<br>var balance = [5]float32{1000.0, 2.0, 3.4, 7.0, 50.0}<br>初始化数组中 {} 中的元素个数不能大于 [] 中的数字。<br>如果忽略 [] 中的数字不设置数组大小,Go 语言会根据元素的个数来设置数组的大小:<br>var balance = [...]float32{1000.0, 2.0, 3.4, 7.0, 50.0}
切片 Slice
Go 语言切片是对数组的抽象。<br>Go 数组的长度不可改变,在特定场景中这样的集合就不太适用,<br>Go中提供了一种灵活,功能强悍的内置类型切片("动态数组"),与数组相比切片的长度是不固定的,<br>可以追加元素,在追加时可能使切片的容量增大。
定义切片<br>你可以声明一个未指定大小的数组来定义切片:<br>var identifier []type<br>切片不需要说明长度。<br>或使用make()函数来创建切片:<br>var slice1 []type = make([]type, len)<br>也可以简写为<br>slice1 := make([]type, len)<br>也可以指定容量,其中capacity为可选参数。<br>make([]T, length, capacity)<br>这里 len 是数组的长度并且也是切片的初始长度。
len() 和 cap() 函数<br>切片是可索引的,并且可以由 len() 方法获取长度。<br>切片提供了计算容量的方法 cap() 可以测量切片最长可以达到多少。
append() 和 copy() 函数<br>如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。<br>下面的代码描述了从拷贝切片的 copy 方法和向切片追加新元素的 append 方法。
集合 Map
Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。<br>Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。<br>不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。
结构体 Struct
Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型。<br>结构体是由一系列具有相同类型或不同类型的数据构成的数据集合。
定义结构体<br>结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。<br>type 语句设定了结构体的名称。结构体的格式如下:<br>type struct_variable_type struct {<br> member definition<br> member definition<br> ...<br> member definition<br>}<br>一旦定义了结构体类型,它就能用于变量的声明,语法格式如下:<br>variable_name := structure_variable_type {value1, value2...valuen}<br>或<br>variable_name := structure_variable_type { key1: value1, key2: value2..., keyn: valuen}
错误处理 Error
并发编程 goroutine
通道 Channel
收藏
收藏
0 条评论
下一页