golang介绍,特点,项目结构,基本变量类型与声明介绍(数组,切片,映射),控制流语句介绍(条件,循环,switch case)
目录
golang
介绍
面向并发
面向组合
特点
项目结构
图示
入口文件 main.go
基本变量类型与声明
介绍
声明变量
常量
字符串(string)
字符串格式化
空接口类型
数组
切片
创建对象
追加元素
复制切片
map(映射)
创建对象
使用
多重赋值
控制流语句
if else
循环
switch case语句
golang
介绍
Go(也叫 Golang)是由 Google 开发的开源编程语言,设计目标是简洁、效率和高并发
- 自从 2009 年发布以来,Go 迅速发展,特别是在云计算、微服务、容器化(如 Docker 和 Kubernetes)等领域得到了广泛应用
- Go 语言是一门面向并发和面向组合的语言
面向并发
Go 的并发模型通过 goroutine 和 channel 来实现轻量级的并发
- goroutine:Go 通过轻量级的线程——goroutine,支持并发编程,允许程序同时执行多个任务。Goroutines 的创建和切换成本非常低,比传统线程更高效
- channel:Go 通过 channel 实现 goroutine 之间的通信,确保数据在并发环境中的安全传递。Go 使用 通信顺序进程(CSP)模型,通过管道(channel)将数据从一个 goroutine 传递到另一个
面向组合
Go 语言的设计偏向 组合 而非 继承
- 这使得 Go 在实现面向对象编程时,避免了传统oop中的类继承层次 (虽然它有一些支持面向对象编程的特性,但它并不遵循经典的面向对象范式)
- 提供了结构体(struct)和接口(interface)来实现对象行为
特点
高性能高并发
- 内置对高并发的支持,不需要寻找经过高性能优化的第三方库
- 只需要应用标准库或基于标准库开发的第三方库即可
语法类似c语言,但是简化版,非常简洁
- 去除了许多其他编程语言中常见的复杂特性
标准库功能丰富
- 涵盖了从网络、加密到并发等多个方面的功能
工具链完善
- 内置了单元测试框架
静态编译
- 不需要附加其他东西,部署方便快捷
快速编译
- 能快速构建并测试代码
跨平台
- 开发和部署的过程非常简单
垃圾回收机制
- 不需要考虑内存分配释放,类似java
项目结构
图示
入口文件 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嵌套体使用