GO语言
2024-05-29 10:48:06 5 举报
AI智能生成
GO语言是一种开源的编程语言,由Google于2007年开发,旨在提高软件开发效率和生产率。作为一种静态类型、编译型语言,GO语言支持函数式编程和面向对象编程,具有简洁的语法和清晰的代码结构。GO语言具有高效的性能,适用于开发大型软件项目和系统级编程。它的并发机制可以实现轻量级线程或协程,使得处理多个任务变得简单而高效。此外,GO语言还提供了丰富的标准库和工具,如网络编程、文件操作、加密算法等。GO语言的文件类型通常为.go,而在编写GO语言代码时,通常会添加一些修饰语,如package、import等。
作者其他创作
大纲/内容
入门
是什么?
Google设计
静态类型、编译型
简洁、高效、高性能
适用构建高并发网络服务和大型软件系统
构建云服务和网络服务器
微服务架构
分布式系统和服务
工具和命令行应用
系统编程
数据库和存储系统
特点
第三方库多版本维护
允许同一个模块多个版本共存
内置于几乎所有的 go 命令
不同项目的相同模块版本、服务器只会缓存一份
go.mod 和 go.sum 文件来记录以来的第三方库信息
Go Modules 基本概念
6-2-2-1-1
六个环境变量
GO111MODULE
GOPATH模式 或 Go Module模式
GOPROXY
下载源
GOPRIVATE
指定不走代理的Go包域名(同时不走SUMDB校验)
GONOPROXY
指定不走代理的Go包域名(但是走SUMDB校验)
GOSUMDB
指定地址用于查询依赖包指定版本的哈希值,保证拉取到的模块版本数据没有被篡改
GONOSUMDB
指定不走哈希值版本校验的Go包域名
两个概念
Go module proxy 和 Go checksum database
下载源
两个主要文件
go.mod 和 go.sum
存储第三方库的信息
go.mod
module
指定当前项目对应的模块路径
go
设置预期版本
require
当前项目依赖哪些第三方模块信息
replace
替换
$module => $newmodule
exclude
排除特性模块
一个主要管理命令
go mod
download
edit
graph
init
tidy
添加丢失的模块、移除无用模块(默认不启动)
vendor
将所有依赖包存到当前目录下的 vendor 目录下
verify
检查当前模块的依赖是否已经存储在本地下载的源代码缓存中
why
为什么需要
一个 build flag
1.17引入的实验性功能
go.work(工作区模式)
旨在解决在同一环境中工作和测试多个相关的Go模块的问题
目录结构规范
Go应用
开发阶段
前端
/web
后端
/cmd
/internal
/authzserver、/internal/apiserver、/internal/pump
应用目录、代码
/iamctl
客户端工具
/pkg
内部共享包存放的目录
/code
项目业务 Code 码
/validation
一些通用的验证函数
/middleware
HTTP 处理链
/apiserver/api/v1
HTTP API 接口的具体实现、解包、参数校验、业务逻辑处理、返回
/apiserver/options
应用的 command flag
/apiserver/config
根据命令行参数创建应用配置
/apiserver/service
存放应用复杂业务处理代码
/apiserver/store/mysql
数据库交互的代码
/vendor
/third_party
测试阶段
/test
/data
/testdata
部署阶段
/config
配置文件模板或默认配置
/deployments
存放 Iaas、PaaS 系统和容器编排部署配置和模板
/init
项目管理
/Makefile
项目管理工具、用来执行静态代码检查、单元测试、编译
/tools
存放这个项目的支持工具。这些工具可导入来自 /pkg 和 /internal 目录的代码
/scripts
存放脚本文件,实现构建、安装、分析等功能
/make-rules
用来存放 makefile 文件、实现 /Makefile 文件中的各个功能
/lib
shell 库,用来存放 shell 脚本
/install
支持自动化部署,可以将自动化部署脚本放在此目录下
/githooks
将 commit-msg 存放在该目录
/build
存放安装包和持续集成相关的文件
/package
存放容器(Docker)、系统(deb, rpm, pkg)的包配置和脚本
/ci
存放 CI(travis,circle,drone)的配置文件和脚本
/docker
存放子项目各个组件的 Dockerfile 文件
/assets
图片、CSS、JavaScript
/website
放置项目网站相关的数据
文档
/README.md
项目的介绍、功能、快速安装和使用指引、详细的文档链接以及开发指引
/docs
存放设计文档、开发文档和用户文档
/CONTRIBUTING.md
开源项目使用、用于开源协同、规范协同
/api
存放的是当前项目对外提供的各种不同类型的 API 接口定义文件
/api/protobuf-spec、/api/thrift-spec、/api/http-spec、openapi、swagger
/LICENSE
版权文件可以是私有的,也可以是开源的、Apache 2.0、MIT、BSD、GPL、Mozilla、LGPL
/CHANGELOG
更新记录
/examples
存放应用程序或者公共包的示例代码
编码规范
命名规范
源文件
小写字母、_ 连接、 后缀 .go
首字母大写 可被其它位置引用
_test.go 单测文件
包规范
每个 Go 程序中仅允许存在一个名为 main 的包
import 导入依赖
函数规范
init 函数
构造器
包初始化
Test函数表示为单测方法
标准 Go 代码风格使用 Tab 而不是空格来实现缩进的
基本语法
变量
var 变量名 变量类型 = 变量值
var 变量名 = 变量值
类型推测
var 变量名 变量类型
初始化
变量名 := 变量值
代替 var
可以同时多个赋值
变量类型
原生
0
整形
0
浮点
0.0
布尔
false
字符串
""
指针、接口、切片、channel、map、函数类型
nil
规范
包级变量
必须 var 声明方式
局部变量
延迟化
可用 var 声明方式
非延迟化
使用 := 声明方式
常量
const NAME 变量类型 = ""
支持无类型常量
支持隐式自动转化
可用于实现枚举
隐式重复前一个非空表达式
iota :预定义标识符
生命周期
一个 const 代码块
基础数据类型
不支持隐式类型转化
变量名 = 变量类型 ( 变量名 )
字符串类型
不可变
获取长度的时间复杂度是常数时间
` `
转义字符不起作用
rune
表示一个 Unicode 码点、与 int32 类型等价
一个 rune 实例就是一个 Unicode 字符,一个 Go 字符串也可以被视为 rune 实例的集合
字符迭代
for
结果是组成字符串内容的一个字节以及该字节所在的下标值
for range
结果是字符串的一个字符
计算长度
len( []rune( 变量名 ) )
字符串转换
字符串 与 rune 自由转换
字符串数字化
字符串--数字
strconv 工具
数字--字符串
fmt.Sprintf("%d", b)
字符串切分
split()
数组
切片
Map
并发写不安全、不支持并发读写、并发读没问题
sync.Map:支持并发读写
结构体(类)
指针类型
&
地址运算符
返回这个变量的内存地址
返回结构体的地址
避免复制整个结构体
修改结构体需要有一个指向它的指针
*
r 是类型的指针 、r 存储的是类型值的内存地址、不是真实的值
直接操作数据、而不是复制数据
可以是 nil
条件和循环语句
函数
0 条评论
下一页