hincky的主页 hincky的主页
  • 2023

    • nginx
    • prometheus
    • 小工具
    • 部署
  • 数据库

    • MySQL是怎么使用/运行的
    • Redis核心技术与实战
  • 极客时间

    • Web协议详解与抓包实战
    • SQL必知必会
    • MySQL45讲
个人日常
  • 分类
  • 标签
  • 归档
  • 随笔
GitHub (opens new window)

Hincky

当有趣的人,做想做的事
  • 2023

    • nginx
    • prometheus
    • 小工具
    • 部署
  • 数据库

    • MySQL是怎么使用/运行的
    • Redis核心技术与实战
  • 极客时间

    • Web协议详解与抓包实战
    • SQL必知必会
    • MySQL45讲
个人日常
  • 分类
  • 标签
  • 归档
  • 随笔
GitHub (opens new window)
  • 2022

    • 年度清单
    • 十一月

      • 十一月待办
        • go 路程
          • 基础
          • 中级
          • 高级
        • go-gin-api项目
        • go-vue-admin项目
      • 添加dns域名解析
        • 线上环境
        • 线下环境
      • k8s操作规范
        • 命名规范
          • 组件命名
          • 属性命名
        • 命令操作
          • namespace
          • deploy
          • service
          • ConfigMap
      • rancher操作规范
        • 命名规范
          • 组件命名
          • 属性命名
        • API规范
        • 新应用部署
          • 创建阿里云镜像仓库
          • 镜像打包和推送
          • 应用部署
      • jenkins镜像打包推送
        • 新建工作流
      • rancher应用部署
        • 新建命名空间
        • 新建工作负载
        • 新建负载均衡
      • docker
        • docker清理过期/停止容器
        • docker清理none镜像
        • 添加自动重启
      • 词组积累
      • 11-14 go项目本地运行踩坑
        • go项目本地运行
          • 问题出现
      • 11-15 公司资源整理
        • url
        • 服务器说明
        • rancher
      • 11-16 寻找数据库迁移工具
        • 公司资源整理文档
        • go结构体
        • 数据库迁移备份
          • golang-migrate
          • 命令介绍
          • canal
        • go项目发布部署
      • 11-17 锦上花问题排查
        • 公司资源整理文档
        • 锦上花项目问题排查
          • 问题描述
          • 环境对比
          • 部署对比
          • 排查步骤
        • 结案
      • 11-18 部署jsh-mes后端项目
        • 部署jsh-mes后端项目
          • 镜像推送
          • 问题出现
          • 应用部署
        • 留坑
      • 11-19 人脸识别SDK过期处理
        • 人脸识别SDK过期处理
          • 参考指南
        • 替换SDK解决思路:
          • 替换SDK文件
          • Jenkins发布镜像
          • 本地集群部署
          • 创建deploy
          • 配置域名访问
          • 用新域名就创建新service
          • 添加dns域名解析
          • 配置service
          • 延用旧域名
      • 11-20 go语言介绍
        • go执行基本
          • 单 Go 源文件
          • 复杂的 Go 项目
          • 总结
        • go布局
          • cmd
          • 依赖管理
          • pkgN
          • vendor
          • 总结
        • go布局
        • main入口函数
          • go包初始化顺序
          • init 函数常见用途:
          • init 函数具备的几种行为特征
      • 11-21 go简单web服务
        • faceGo项目jenkins镜像发布问题
        • 开了代理访问不了内网应用
          • mac系统参考
          • Windows系统参考
        • SniPaste
        • go-web服务
          • ListenAndServe
          • 请求处理函数
          • 捕获请求url
      • 11-22 go_web_mini项目
        • gowebmini_ui
        • gowebmini
          • 项目技术栈
          • 项目结构
          • 属性封装
        • 校友会统计功能
          • 会员数量统计
          • 学历分布统计
          • 地域分布统计
          • 行业分布统计
        • gorm
        • 原生写法
      • 11-23 人脸识别项目问题排查
        • 部署后端项目
          • 新旧项目对比
        • 前端项目验证
          • HBuilder导入项目
          • 微信小程序平台验证
      • 11-24 jenkins+gitlab自动发布镜像
        • jenkins+gitlab自动发布镜像
      • 11-25 bind搭建内网dns服务器
        • dns相关参数说明
        • 安装bind9
          • yum安装bind
          • 编译安装bind9
        • 已有的
      • 11-28 jenkins添加版本脚本
        • jenkins添加版本脚本
      • 11-29《下班后开始新的一天》
        • 《下班后开始新的一天》
          • 多段短时间比一大段长时间更好完成工作
          • 利用晚上时间积攒能量
        • 打工不能财富自由
          • 从自己喜欢的事情开始
          • 开展副业之前
        • 自尊:证明自己价值的证据
          • 只有自己能对自己人生负责
        • 以什么目标来赚钱
          • 如何找副业
        • 晚间计划
          • 曼陀罗思考法
        • 对自己的提问
      • 11-30
        • 与妈妈的谈话
        • 信用卡的使用
          • 办卡
          • 如何使用
          • 年费坑
        • 怎么找出路
        • 创业
        • 机会
      • 资源说明
        • 服务器
          • 线上环境
          • 线下环境
        • 数据库
          • MySQL
        • 域名以及服务对应关系
          • 线上rancher
          • gitlab,jenkins,rancher资源对应关系表
          • 线下rancher
          • gitlab,jenkins,rancher资源对应关系表
    • 十二月

  • 2023

  • 工作记录
  • 2022
  • 十一月
hincky
2022-11-19
目录

11-20 go语言介绍

  • go执行基本
    • 单 Go 源文件
    • 复杂的 Go 项目
      • 总结
  • go可执行项目布局
    • cmd
    • 依赖管理
    • pkgN
    • vendor
    • 总结
  • go库项目布局
  • main入口函数
    • go包初始化顺序
    • init 函数常见用途:
    • init 函数具备的几种行为特征

go大版本更新

版本 更新 说明
1.5 实现自举 简单来说就是早期编译器是C写的,1.5后的编译器是Go写的
1.11 解决包依赖问题 项目不用再写在src里面了,引入了go module
1.13 引入 go.mod 和 go.sum 实现精准的可重现构建
1.16 Go module 成为默认的包依赖管理机制和源码构建机制。

go天生支持包并发,且生产效率高,其应用的执行效率,十分适合开发类似:短信网关、5G 消息网关、MQTT 网关,还有 API 网关等等

  • 简单
  • 显式 go不能像隐式类型转换,只能是同一种类型的数据进行混合运算
  • 组合
  • 并发
  • 面向工程

# go执行基本

# 单 Go 源文件

go build 命令 +Go 源文件名的方式编译

运行与构建

go run xxx.go
go build xxx.go
./xxx //.\xxx.exe //windows
1
2
3

# 复杂的 Go 项目

我们需要在 Go Module 的帮助下完成项目的构建。

现在给出一个较为复杂的项目

package main

import (
  "github.com/valyala/fasthttp"
    "go.uber.org/zap"
)

var logger *zap.Logger

func init() {
  logger, _ = zap.NewProduction()
  }

  func fastHTTPHandler(ctx *fasthttp.RequestCtx) {
    logger.Info("hello, go module", zap.ByteString("uri", ctx.RequestURI()))
}

func main() {
    fasthttp.ListenAndServe(":8081", fastHTTPHandler)
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

思路:

  1. 直接go build main.go,会报错,没有go.mod文件
  2. go mod init github.com/bigwhite/hellomodule添加go.mod文件
  3. cat go.mod查看module包
  4. 有了go.mod文件,就可以构建了吧?再次go build main.go,缺少依赖的版本信息
  5. go mod tidy自动添加版本信息
  6. 再次go build main.go就可以构建项目了,访问http://localhost:8081/验证后台信息

go module的核心是一个名为 go.mod 的文件,在这个文件中存储了这个 module 对第三方依赖的全部信息

go mod init 命令的执行结果是在当前目录下生成了一个 go.mod 文件

其实,一个 module 就是一个包的集合,这些包和 module 一起打版本、发布和分发。go.mod 所在的目录被我们称为它声明的 module 的根目录。

# 总结

go mod init `项目所在的文件夹名`  // 生成go.mod文件
go mod tidy // 自动添加依赖版本信息
go build main.go //构建go项目
1
2
3

# go可执行项目布局


$tree -F exe-layout 
exe-layout
├── cmd/
│   ├── app1/
│   │   └── main.go
│   └── app2/
│       └── main.go
├── go.mod
├── go.sum
├── internal/
│   ├── pkga/
│   │   └── pkg_a.go
│   └── pkgb/
│       └── pkg_b.go
├── pkg1/
│   └── pkg1.go
├── pkg2/
│   └── pkg2.go
└── vendor/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# cmd

cmd目录(有些命名为app,作用一样)

存放项目要编译构建的可执行文件对应的 main 包的源文件。

作用:

  • 命令行参数解析
  • 资源初始化
  • 日志设施初始化
  • 数据库连接初始化等工作

# 依赖管理

go.mod和go.sum

# pkgN

存放项目自身要使用、同样也是可执行文件对应 main 包所要依赖的库文件,同时这些目录下的包还可以被外部项目引用

# vendor

可选目录,以前的依赖管理包路径,现在被go module代替了

# 总结

如果有且只有一个可执行程序要构建,可如下


$tree -F -L 1 single-exe-layout
single-exe-layout
├── go.mod
├── internal/
├── main.go
├── pkg1/
├── pkg2/
└── vendor/
1
2
3
4
5
6
7
8
9

# go库项目布局

$tree -F lib-layout 
lib-layout
├── go.mod
├── internal/
│   ├── pkga/
│   │   └── pkg_a.go
│   └── pkgb/
│       └── pkg_b.go
├── pkg1/
│   └── pkg1.go
└── pkg2/
    └── pkg2.go
1
2
3
4
5
6
7
8
9
10
11
12

库项目仅通过 go.mod 文件明确表述出该项目依赖的 module 或包以及版本要求就可以了

Go 库项目的初衷是为了对外部(开源或组织内部公开)暴露 API

对于仅限项目内部使用而不想暴露到外部的包,可以放在项目顶层的 internal 目录下面。

# main入口函数

main包下main函数是主函数,即入口函数

但不一定是第一个执行,还要看有没有init函数。且init()不能在main()里面显示调用

# go包初始化顺序

  1. 依赖包按“深度优先”的次序进行初始化;
  2. 每个包内按以“常量 -> 变量 -> init 函数”(main.main 函数前)的顺序进行初始化;
  3. 包内的多个 init 函数按出现次序进行自动调用。

# init 函数常见用途:

  1. 重置包级变量值;
  2. 实现对包级变量的复杂初始化;
  3. 在 init 函数中实现“注册模式”(工厂设计模式)- 空导入。

# init 函数具备的几种行为特征

init 函数十分适合做一些包级数据初始化工作以及包级数据初始状态的检查工作:

  1. 执行顺位排在包内其他语法元素的后面;
  2. 每个 init 函数在整个 Go 程序生命周期内仅会被执行一次;
  3. init 函数是顺序执行的,只有当一个 init 函数执行完毕后,才会去执行下一个 init 函数。
编辑 (opens new window)
11-19 人脸识别SDK过期处理
11-21 go简单web服务

← 11-19 人脸识别SDK过期处理 11-21 go简单web服务→

最近更新
01
集成chatgpt的工具
05-24
02
修改服务器ssh默认连接端口
05-22
03
阿里云免费证书
05-15
更多文章>
Theme by Vdoing | Copyright © 2022-2023 Hincky | MIT License | 粤ICP备2022120427号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式