当前位置: 首页 > news >正文

Golang 构建学习

Golang 构建学习

如何搭建Golang开发环境

1. 下载GOlang包

  1. https://golang.google.cn/dl/ 在地址上下载Golang

2. 配置包环境

  1. 修改全局环境变量,GOPROXY,GOPATH,GOROOT
GOPROXY=https://goproxy.cn,direct
GOROOT="" // go二进制文件的路径
  1. mkdir project 创建项目文件
  2. go mod init project 创建包模块
  3. go get xxxxx 获取第三方包

如何让程序运行起来

// main.go
package mainimport "fmt"func main(){fmt.Println("hello world")
}
  • go run main.go 执行程序运行
  • 程序的入口,要使用package main表示为主要入口,入口函数为func main
  • import "fmt"在使用包需要引入,如果是自定义的包,则从自己初始化的模块project开始,例如:go mod init project
  • fmt.Println 打印日志,包中对外提供的接口,是要求首字母大写来表示的

如何编写函数

func (file *File) Write(b []byte) (n int, err error){}  // 1 example
func Write(b []byte) (int, error) {return 0, nil} // 2 example
func nextInt(b []byte, pos int) (value, nextPos int) { return 0, 0} // 3 example
// ---------多值输入-----------------
func MyPrint(words ...string){for _, w := range words{fmt.Println(w)}
}
MyPrint("ab", "cd", "ef")
// ---------End----------------------
// ----------值传递和指针传递---------------
var a = 5
func changeWithValue(b int){b = 4
}
func changeWithPoint(b *int){*b = 4
}changeWithValue(a)  // a is 5
changeWithPoint(&a) // a is 4

第一个例子:
第一个括号是类的实例句柄file,调用这个函数的只能是File类,首字母大写表示对外的接口。
第二个括号表示的输入参数,表示字节数组类型
第三个括号表示的输出参数,第一个输出参数为int类型,第二个输出参数为error类型

第二个例子:
没有第一个括号的类声明,函数首字母大写说明是模块对外的接口调用
第二个括号是输入参数的声明
第三个括号是输出参数的声明,注意这个没有向上面例子中提前声明返回值变量,需要在函数体中{},声明返回值变量

第三个例子:
与以上雷同,区别在于返回值,如果两个相同类型的返回值,则可以采用省略的写法v1, v2 int

多值输入例子:
注意Myprint函数的定义与调用处。
函数定义: 2个以上的相同参数,可以使用...string声明类型,承载的是[]string数组
函数调用: (str1, str2, str3)

值传递和引用传递
值传递:函数中使用的是被复制的值,不影响外部数据
引用传递: 函数中使用的是指向值的指针地址,通过函数修改传递的数据

注意上面的用法: 指针声明*int和 地址传递&a

如何导入函数

如果是创建的项目,执行go mod init project,项目内的模块引入,则通过project.module引入
函数如果是在模块内部,也就是同一个package目录下,则不同导入,直接调用就行
函数如果是要被外部模块调用,一律首字母要大写,并且模块先要被引入

import _ "net/http/pprof"不以模块的方式调用,模块下的对外函数全引入

如何构建多平台的二进制文件

BINARY_NAME=myproject
VERSION=v2.1.0
BUILD_TIME=$(shell date +'%Y.%m.%d %H:%M:%S')
LDFLAGS="-s -w -X main.version=$(VERSION) -X 'main.buildTime=$(BUILD_TIME)'"swag:swag init cmd/server.go -o docs# sed -i '/LeftDelim/d' ./docs/docs.go# sed -i '/RightDelim/d' ./docs/docs.gobuild:        env GO111MODULE=on GOPROXY=https://proxy.golang.com.cn,direct go mod tidyenv GO111MODULE=on GOPROXY=https://proxy.golang.com.cn,direct go mod vendorenv GO111MODULE=on GOPROXY=https://goproxy.io,direct CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags $(LDFLAGS) -o bin/$(BINARY_NAME) cmd/server.goenv GO111MODULE=on GOPROXY=https://goproxy.io,direct CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags $(LDFLAGS) -o bin/$(BINARY_NAME).mac cmd/server.goenv GO111MODULE=on GOPROXY=https://goproxy.io,direct CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags $(LDFLAGS) -o bin/$(BINARY_NAME).exe cmd/server.goupx -9 bin/yxapi
clean:rm bin/$(BINARY_NAME)rm bin/$(BINARY_NAME).macrm bin/$(BINARY_NAME).exe

参考以上的代码,即可创建多个平台二进制文件

构建Web开发

Web开发虽然可以用多种不同的语言实现,但是基本的理论是一致的,比如鉴权,路由,数据库抽象,参数校验,mvc分层等等。

1. 如何组织代码

目录结构如下:
Project

  • bin go build构建的输出目录
  • cmd 二进制命令程序
    • server.go 服务的启动程序
  • configs 配置目录
    • *.sql 初始化的二进制文件
    • config.yaml 配置文件
    • mongo.go mongo的配置结构
    • mysql.go mysql配置结构
    • redis.go redis配置结构
    • server.go 服务的配置结构
  • docker
    • README.md
  • docs 此目录由swag init生成
  • internal 服务的内容模块
    • controllers MVC结构的Controller
    • middlewares 服务的中间件
      • auth.go
      • cors.go
      • errorHandle.go
    • modles 数据模型 MVC结构的模型层
    • pkg 业务之外的基础库,基础库不应该包含业务逻辑
      • logger
      • mongo
      • token
    • router 项目的服务路由
      • router.go
    • services 服务模块,通常是控制层调用此服务层,服务层调用模型层
      • devices.go
  • logs 日志输出文件
  • go.mod
  • Makefile
  • README.md

以上目录结构,主要参考的此作者的Githubsanjayheaven

2. 开发过程中的关键概念有哪些

参考Gin web Framework
罗列关键概念如下:

  1. 解析请求
    1. form表单数据
    2. body数据
    3. 路由参数的设置
  2. 输入参数校验与模型化
  3. 多个路由组
  4. 使用中间件
  5. 响应处理
  6. 重定向
  7. Cookie与Token处理
  8. 上传文件

3. 如何判定是否有必要创建模块

4. 如何设计模块

5. 如何使用swager模块

  1. go install github.com/swaggo/swag/cmd/swag@latest 安装swag工具
  2. swag init -g cmd/server.go -o docs 从主文件导入并初始化目录到docs目录下

如何进行描述呢

// @Tags 设备
// @Summary 某一个设备类型下的所有设备
// @Description  某一个设备类型下的所有设备
// @Param l query int false "记录条数"
// @Param type query string false "设备类型"
// @Param online query string false "在线与否(只支持all)"
// @Param search_key query string false "搜索关键词(不支持)"
// @Success 200 {object} nil
// @Router /api/xxx/device [get]
func (dc *DeviceController) DeviceTypeList(c *gin.Context){return c.JSON(http.StatusOK, "hello world")
}

针对输入参数,由querypath,formData

Token 生成

  • Token 生成

持续更新中…

相关文章:

Golang 构建学习

Golang 构建学习 如何搭建Golang开发环境 1. 下载GOlang包 https://golang.google.cn/dl/ 在地址上下载Golang 2. 配置包环境 修改全局环境变量,GOPROXY,GOPATH,GOROOT GOPROXYhttps://goproxy.cn,direct GOROOT"" // go二进…...

VM Virutal Box的Ubuntu虚拟机与windows宿主机之间设置共享文件夹(自动挂载,永久有效)

本文参考如下链接 How to access a shared folder in VirtualBox? - Ask Ubuntu (1)安装增强功能(Guest Additions) 首先,在网上下载VBoxGuestAdditions光盘映像文件 下载地址:Index of http://…...

分析 系统滴答时钟(tickClock),设置72MHz系统周期,如何实现1毫秒的系统时间?

一、CubeMX相关配置 1.1 相关引脚配置 1.2 相关时钟数配置 1.3 打开程序源码 二、相关函数分析...

C++优选算法十七 多源BFS

1.单源最短路问题 一个起点一个终点。 定义:在给定加权图中,选择一个顶点作为源点,计算该源点到图中所有其他顶点的最短路径长度。 2.多源最短路问题 定义:多源最短路问题指的是在图中存在多个起点,需要求出从这些…...

Mongodb入门到放弃

Mongodb分片概括 分片在多台服务器上分布数据的方法, Mongodb使用分片来支持具有非常大的数据集和高吞吐量的操作的部署 具有大数据集和高吞吐量应用程序的数据库系统,可以挑战单台服务器的容量。 例如,高查询率可以耗尽服务器的cpu容量&…...

青藤云安全携手财信证券,入选金融科技创新应用优秀案例

11月29日,由中国信息通信研究院主办的第四届“金信通”金融科技创新应用案例评选结果正式发布。财信证券与青藤云安全联合提交的“基于RASP技术的API及数据链路安全治理项目”以其卓越的创新性和先进性,成功入选金融科技创新应用优秀案例。 据悉&#x…...

在CentOS系统中安装工具包的时候报错的解决方法

我刚装了一个新的虚拟机,打算安装一些工具出现了错误信息 执行的命令如下: yum install -y yum-utils device-mapper-persistent-data lvm2错误信息如下 Cannot find a valid baseurl for repo: base/7/x86_64搜索了一下原因有好几种。 一是网络不通…...

cad软件打不开报错cad acbrandres dll加载失败

一切本来很顺利哒 但是,当我用快捷方式打开时,就出现了这个错误。进入文件路径,是有这个的; 在文件路径直接打开,也会提示错误 原因竟然是我改了个名字: 随便选的文件路径,空的,文件名为Acr…...

14、保存与加载PyTorch训练的模型和超参数

文章目录 1. state_dict2. 模型保存3. check_point4. 详细保存5. Docker6. 机器学习常用库 1. state_dict nn.Module 类是所有神经网络构建的基类,即自己构建一个深度神经网络也是需要继承自nn.Module类才行,并且nn.Module中的state_dict包含神经网络中…...

【前端开发】JS+Vuew3请求列表数据并分页

应用技术:原生JavaScript Vue3 $(function () {ini(); });function ini() {const { createApp, ref, onMounted } Vue;createApp({setup() {const data ref({studentList: [],page: 1,pageSize: 10,});const getStudentList async (page, key) > {window.ons…...

Trimble X12助力电力管廊数据采集,为机器人巡视系统提供精准导航支持

地下电缆是一个城市重要的基础设施,它不仅具有规模大、范围广、空间分布复杂等特点,更重要的是它还承担着信息传输、能源输送等与人们生活息息相关的重要功能,也是一个城市赖以生存和发展的物质基础。 01、项目概述 本次项目是对某区域2公里左…...

Docker 清理镜像策略详解

文章目录 前言一、删除 Docker 镜像1. 查看当前镜像2. 删除单个镜像3. 删除多个镜像4. 删除所有未使用的镜像5. 删除悬空的 Docker 镜像6. 根据模式删除镜像7. 删除所有镜像 二、删除 Docker 容器1. 查找容器2. 删除一个或多个特定容器3. 退出时删除容器4. 删除所有已退出的容器…...

【Linux】TCP网络编程

目录 V1_Echo_Server V2_Echo_Server多进程版本 V3_Echo_Server多线程版本 V3-1_多线程远程命令执行 V4_Echo_Server线程池版本 V1_Echo_Server TcpServer的上层调用如下,和UdpServer几乎一样: 而在InitServer中,大部分也和UDP那里一样&…...

排序学习整理(2)

上集回顾 排序学习整理(1)-CSDN博客 2.3 交换排序 交换排序的基本思想是:根据序列中两个记录键值的比较结果,交换这两个记录在序列中的位置。 特点: 通过比较和交换操作,将键值较大的记录逐步移动到序列…...

AI蛋白质设计与人工智能药物设计

AI蛋白质设计与人工智能药物设计 AI蛋白质设计 一、蛋白质相关的深度学习简介 1.基础概念 1.1.机器学习简介:从手写数字识别到大语言模型 1.2.蛋白质结构预测与设计回顾 1.3.Linux简介 1.4.代码环境:VS code和Jupyter notebook* 1.5.Python关键概…...

IOS ARKit进行图像识别

先讲一下基础控涧,资源的话可以留言,抽空我把它传到GitHub上,这里没写收积分,竟然充值才能下载,我下载也要充值,牛! ARSCNView 可以理解画布或者场景 1 配置 ARWorldTrackingConfiguration AR追…...

初级数据结构——二叉搜索树

目录 前言一、定义二、基本操作三、时间复杂度分析四、变体五、动态图解六、代码模版七、经典例题[1.——700. 二叉搜索树中的搜索](https://leetcode.cn/problems/search-in-a-binary-search-tree/)代码题解 [2.——938. 二叉搜索树的范围和](https://leetcode.cn/problems/ra…...

C++设计模式之组合模式中如何实现同一层部件的有序性

在组合模式中,为了实现同一层上部件的有序性,可以采取以下几种设计方法: 1. 使用有序集合 使用有序集合(如 std::list、std::vector 或其他有序容器)来存储和管理子部件。这种方法可以确保子部件按照特定顺序排列&am…...

duxapp RN 端使用AppUpgrade 进行版本更新

版本更新包含了组件和工具的组合 注册 下面这是 duxcms 入口文件检查更新的注册方法,注册的同时会检查更新 import {request,updateApp,userConfig } from ./utils// 检查app更新 setTimeout(async () > {if (process.env.TARO_ENV rn) {// eslint-disable-n…...

【计网】自定义序列化反序列化(三) —— 实现网络版计算器【下】

🌎实现网络版计算器【下】 本次序列化与反序列化所用到的代码,Tcp服务自定义序列化反序列化实现网络版计算器。 文章目录: 实实现网络版计算器【下】 客户端实现     基于守护进程的改写 🚀客户端实现 在这之前&#xff0c…...

ES6从入门到精通:前言

ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

逻辑回归暴力训练预测金融欺诈

简述 「使用逻辑回归暴力预测金融欺诈&#xff0c;并不断增加特征维度持续测试」的做法&#xff0c;体现了一种逐步建模与迭代验证的实验思路&#xff0c;在金融欺诈检测中非常有价值&#xff0c;本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

springboot 日志类切面,接口成功记录日志,失败不记录

springboot 日志类切面&#xff0c;接口成功记录日志&#xff0c;失败不记录 自定义一个注解方法 import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target;/***…...

前端高频面试题2:浏览器/计算机网络

本专栏相关链接 前端高频面试题1&#xff1a;HTML/CSS 前端高频面试题2&#xff1a;浏览器/计算机网络 前端高频面试题3&#xff1a;JavaScript 1.什么是强缓存、协商缓存&#xff1f; 强缓存&#xff1a; 当浏览器请求资源时&#xff0c;首先检查本地缓存是否命中。如果命…...