目录
golang-toc" name="tableOfContents" style="margin-left:0px">golang
介绍
面向并发
面向组合
特点
项目结构
图示
go-toc" name="tableOfContents" style="margin-left:80px">入口文件 main.go
基本变量类型与声明
介绍
声明变量
常量
字符串(string)
字符串格式化
空接口类型
数组
切片
创建对象
追加元素
复制切片
map(映射)
创建对象
使用
多重赋值
控制流语句
if else
循环
switch case语句
golang" name="golang">golang
介绍
Go(也叫 Golang)是由 Google 开发的开源编程语言,设计目标是简洁、效率和高并发
- 自从 2009 年发布以来,Go 迅速发展,特别是在云计算、微服务、容器化(如 Docker 和 Kubernetes)等领域得到了广泛应用
- Go 语言是一门面向并发和面向组合的语言
面向并发
Go 的并发模型通过 goroutine 和 channel 来实现轻量级的并发
面向组合
Go 语言的设计偏向 组合 而非 继承
- 这使得 Go 在实现面向对象编程时,避免了传统oop中的类继承层次 (虽然它有一些支持面向对象编程的特性,但它并不遵循经典的面向对象范式)
- 提供了结构体(struct)和接口(interface)来实现对象行为
特点
高性能高并发
- 内置对高并发的支持,不需要寻找经过高性能优化的第三方库
- 只需要应用标准库或基于标准库开发的第三方库即可
语法类似c语言,但是简化版,非常简洁
- 去除了许多其他编程语言中常见的复杂特性
标准库功能丰富
- 涵盖了从网络、加密到并发等多个方面的功能
工具链完善
- 内置了单元测试框架
静态编译
- 不需要附加其他东西,部署方便快捷
快速编译
- 能快速构建并测试代码
跨平台
- 开发和部署的过程非常简单
垃圾回收机制
- 不需要考虑内存分配释放,类似java
项目结构
图示
go" name="%E5%85%A5%E5%8F%A3%E6%96%87%E4%BB%B6%20main.go">入口文件 main.go
package main
- 包声明
- 每个 Go 程序都需要一个main包
import (" "...)
- 导入语句
- 这里的import语句导入了两个标准库:fmt,os
func main() { }
- 主函数,程序的入口点
基本变量类型与声明
介绍
声明变量
var 变量名 = value
- 会自动根据值类型推导变量类型
或是显式写出类型:
- var 变量名 类型 = value
- 变量名 := 类型(value)
常量
将声明变量时的var -> const
字符串(string)
go的内置类型
- 字符串包 -- strings
可以对字符串直接使用运算符(优先级和c/c++类似)
- 比如: +拼接
字符串格式化
Go 语言使用
fmt
包进行字符串格式化,可以根据需求灵活地控制输出格式
- 可以使用%v代表任意类型的变量,而不需要区分数字/字符串...的区别
- %+v 得到详细结构:
- %#v 得到进一步详细的结构:
- %T 打印变量的类型:
浮点数表示和c/c++相同
- %f 标准浮点数格式
- 且可以限制小数位数,比如%2f
空接口类型
数组
var 数组名 [元素个数]元素类型
- 支持多维数组
- 使用上也没有变化,依然是[ ]
切片
可变长度的数组
创建对象
切片字面量创建切片:
- slice := []元素类型{值1, 值2 ...}
- 也可以是个空切片 -- emptySlice := make([]int, 0)
使用make创建切片:
- make([]元素类型, 初始长度(必须指定), capacity)
从数组/其他切片中切割创建切片:
- slice := arr[起始索引:结束索引] (前闭后开区间)
追加元素
可以使用append()追加元素,根据需要动态扩展切片的容量
- 一次可添加多个元素
- 注意,append必须要赋值回原对象
复制切片
copy()用于从一个切片复制元素到另一个切片
- 它不会改变原切片,但会返回实际复制的元素数量
直接复制:
索引复制:
- 切片名(位置1:位置2) 前闭后开
省略位置参数:
- 可以省略索引中的一些位置,代表从头取 / 取到尾 / 全部取
map(映射)
类似于其他语言中的哈希表或字典
- 随机顺序存储,存储键值对
创建对象
字面量直接初始化:
- mapVariable := map[key值类型]value类型{key1: value1, key2: value2, ...}
make创建:
- make(map[key值类型]value类型, 初始容量(可省略))
使用
使用方法和c++中的map相同
- 可以使用[ ]
- delete()删除k-v对
多重赋值
- 可以使用两个变量来接收value值 和 是否存在某key值(bool类型),可以检查一个键是否存在于映射中
控制流语句
if else
if else 语法基本不变
- 只是不需要写if / else if后面的括号
- 并且,if后面必须要加{ },而不能在只有一行语句的情况下写成同一行
循环
循环仅有for循环
- 相当于其他循环被并入进去了
- 语法并没有变化,只是和if else一样不需要加括号
无条件:
- for {} 代表死循环
带条件:
- for 循环条件 {}
带初始化和后处理:
- 和c/c++语法一样,只是没有括号
同时,continue,break依然被使用
switch case语句
基本语法不变,只是:
- switch后的变量不需要加( )
- 每个case语句之间自动带有[添加break后]的效果 -- 它不会像c/c++一样如果不加break就一直执行下去,它只会执行其中一个分支
并且它还增加了功能
- switch后可以不加变量,直接跳转到分支进行判断,可以代替多个if else嵌套体使用