GOLANG进阶:Viper,Mysql,Swagger

news2024/11/24 15:46:41

GOLANG从浅入深必须学习的一些工具包

1.Viper:

        Viper 是一个完整的 Go 应用程序配置解决方案,优势就在于开发项目中你不必去操心配置文件的格式而是让你腾出手来专注于项目的开发。其特性如下:

        支持 JSON/TOML/YAML/HCL/envfile/Java properties 等多种格式的配置文件
        可以设置监听配置文件的修改,修改时自动加载新的配置
        从环境变量、命令行选项和io.Reader,远程K/V中读取配置
        从远程配置系统中读取和监听修改,如 etcd/Consul
        代码逻辑中显示设置键值

        简单通俗的来说就是配置文件,比如数据库的连接参数(用户名,密码,端口号,数据名等等),这些都可以用viper包来实现存储

        为什么使用viper包来存储固定参数:为的是方便管理,如果项目要移植或者修改参数,直接修改配置文件就可以了,保证代码的健壮

  2. Mysql

        操作数数据库包,基础用法可以参考博主的另外一篇我文章,此处就不再赘述了     

引入包:

go get -u github.com/spf13/viper

怎么使用?实际上存储的数据是存储在一个yml格式的文件中(以数据库连接参数为例子)

1.创建一个文件夹:config

2.创建一个yml文件并写入数据:两种写法,可以自由选择(注意点:yml文件数据冒号后面一定要有空格,要不然没有效果)

//全量配置(不用写入yml文件)

mysql:
  dsn: root:root@tcp(127.0.0.1:3306)/gochect?charset=utf8&parseTime=True&loc=Local

//非全量配置(不用写入yml文件)
    
mysql:
    username: root
    password: root
    address: 127.0.0.1
    port: 3306
    dataname: gochect

3.引入包文件,开始读取包文件配置的数据:

SetConfigName   : 设置yml文件配置名
AddConfigPath      : 设置配置文件所在文件夹的名字
ReadInConfig    : 获取文件是否存在(用于判断是否设置错误)
viper.Get       : 获取单层文件(第一层)
viper.GetString : 获取多层文件(第二层乃至下级更多的层级)

实例代码:

package utils

import (
    "fmt"
    "github.com/spf13/viper"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

//定义变量

var DB *gorm.DB

func InitConfig ()  {
    viper.SetConfigName("app")
    viper.AddConfigPath("config")
    err :=viper.ReadInConfig()
    if err != nil{
        fmt.Println("参数读取错误")
    }
    fmt.Println("数据库配置参数",viper.Get("mysql"))
    fmt.Println("数据库配置参数1",viper.GetString("mysql.dsn"))
}

//此处特殊提醒一下:DB现在是提前定义的变量,该处切不使用 := 去初始化数据,这样就会一直实例化,导致会创建一个新的sqlDb变量,新的sqlDb会把全局变量sqlDb覆盖掉,最终会报错的

func IniMysql()  {
    DB, _ = gorm.Open(mysql.Open(viper.GetString("mysql.dsn")))
}

3.Swagger

        相关的工具集会根据 OpenAPI 规范去生成各式各类的与接口相关联的内容,常见的流程是编写注解 =》调用生成库-》生成标准描述文件 =》生成/导入到对应的 Swagger 工具。

        简单来说就是前后端调试的时候的API文档,该文档可以由Swag通过配置项直接生成

1.引包

GOLANG版本1.17以下:go get -u github.com/swaggo/swag/cmd/swag

GOLANG版本1.17以上:go install github.com/swaggo/swag/cmd/swag@latest

2.初始化

运行命令:swag init

结果(生成docs文件夹):

查看是否安装成功命令:swag -v

3.引入相关包

go get -u github.com/swaggo/gin-swagger
go get -u github.com/swaggo/files

4.配置:

注意点:生成的docs包一定要引入(gochect是项目名称,在mod initi 初始化项目的时候设置的)

package route

import (
    "github.com/gin-gonic/gin"
    swaggerfiles "github.com/swaggo/files"
    ginSwagger "github.com/swaggo/gin-swagger"
    "gochect/docs"
    "gochect/service"
)

func Route() *gin.Engine{
    r := gin.Default()
    //设置路径
    docs.SwaggerInfo.BasePath =""
    r.GET("/index",service.GetIndex)
    //引入swag
    r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerfiles.Handler))

    return r
}

5.运行golang文件,查看是否成功

6.覆盖写入

入口文件配置示例:

//    @title            测试用例
//    @version        1.0
//    @description    测试用例

方法文件配置:

//    @Summary    首页
//    @Tags        首页
//    @Success    200    {string} Helloworld
//    @Router        /index [get]

        到此为止Swag就已经成功了,那么应该有读者会问了,Swag的配置属性有哪些?下面就给介绍一下

通用API信息

注释说明示例
title必填 应用程序的名称。// @title Swagger Example API
version必填 提供应用程序API的版本。// @version 1.0
description应用程序的简短描述。// @description This is a sample server celler server.
tag.name标签的名称。// @tag.name This is the name of the tag
tag.description标签的描述。// @tag.description Cool Description
tag.docs.url标签的外部文档的URL。// @tag.docs.url 
tag.docs.description标签的外部文档说明。// @tag.docs.description Best example documentation
termsOfServiceAPI的服务条款。// @termsOfService 
contact.name公开的API的联系信息。// @contact.name API Support
contact.url联系信息的URL。 必须采用网址格式。// @contact.url 
contact.email联系人/组织的电子邮件地址。 必须采用电子邮件地址的格式。// @contact.email 
license.name必填 用于API的许可证名称。// @license.name Apache 2.0
license.url用于API的许可证的URL。 必须采用网址格式。// @license.url 
host运行API的主机(主机名或IP地址)。// @host localhost:8080
BasePath运行API的基本路径。// @BasePath /api/v1
acceptAPI 可以使用的 MIME 类型列表。 请注意,Accept 仅影响具有请求正文的操作,例如 POST、PUT 和 PATCH。 值必须如“”中所述。// @accept json
produceAPI可以生成的MIME类型的列表。值必须如“Mime类型”中所述。// @produce json
query.collection.format请求URI query里数组参数的默认格式:csv,multi,pipes,tsv,ssv。 如果未设置,则默认为csv。// @query.collection.format multi
schemes用空格分隔的请求的传输协议。// @schemes http https
externalDocs.descriptionDescription of the external document.// @externalDocs.description OpenAPI
externalDocs.urlURL of the external document.// @externalDocs.url 
x-name扩展的键必须以x-开头,并且只能使用json值// @x-example-key {"key": "value"}

使用Markdown描述

如果文档中的短字符串不足以完整表达,或者需要展示图片,代码示例等类似的内容,则可能需要使用Markdown描述。要使用Markdown描述,请使用一下注释。

注释说明示例
title必填 应用程序的名称。// @title Swagger Example API
version必填 提供应用程序API的版本。// @version 1.0
description.markdown应用程序的简短描述。 从api.md文件中解析。 这是@description的替代用法。// @description.markdown No value needed, this parses the description from api.md
tag.name标签的名称。// @tag.name This is the name of the tag
tag.description.markdown标签说明,这是tag.description的替代用法。 该描述将从名为tagname.md的文件中读取。// @tag.description.markdown

API操作

注释描述
description操作行为的详细说明。
description.markdown应用程序的简短描述。该描述将从名为endpointname.md的文件中读取。
id用于标识操作的唯一字符串。在所有API操作中必须唯一。
tags每个API操作的标签列表,以逗号分隔。
summary该操作的简短摘要。
acceptAPI 可以使用的 MIME 类型列表。 请注意,Accept 仅影响具有请求正文的操作,例如 POST、PUT 和 PATCH。 值必须如“Mime类型”中所述。
produceAPI可以生成的MIME类型的列表。值必须如“Mime类型”中所述。
param用空格分隔的参数。param name,param type,data type,is mandatory?,comment attribute(optional)
security每个API操作的安全性。
success以空格分隔的成功响应。return code,{param type},data type,comment
failure以空格分隔的故障响应。return code,{param type},data type,comment
response与success、failure作用相同
header以空格分隔的头字段。 return code,{param type},data type,comment
router以空格分隔的路径定义。 path,[httpMethod]
x-name扩展字段必须以x-开头,并且只能使用json值。

Mime类型

AliasMIME Type
jsonapplication/json
xmltext/xml
plaintext/plain
htmltext/html
mpfdmultipart/form-data
x-www-form-urlencodedapplication/x-www-form-urlencoded
json-apiapplication/vnd.api+json
json-streamapplication/x-json-stream
octet-streamapplication/octet-stream
pngimage/png
jpegimage/jpeg
gifimage/gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构--栈在函数递归中的调用

数据结构–栈在函数递归中的调用 void func2(int x) {int n, m;//... }void func1(int a, int b) {int x;//...func2(x);x 5201314;//... }int main() {int a, b, c;//...func1(a, b);//... }函数调用的特点:最后被调用的函数最先执行结束(LIFO) 函数调用时,需要用…

【人工智能与机器学习】基于卷积神经网络CNN的猫狗识别

文章目录 1 引言2 卷积神经网络概述2.1 卷积神经网络的背景介绍2.2 CNN的网络结构2.2.1 卷积层2.2.2 激活函数2.2.3 池化层2.2.4 全连接层 2.3 CNN的训练过程图解2.4 CNN的基本特征2.4.1 局部感知(Local Connectivity)2.4.2 参数共享(Parameter Sharing)…

顶点数据加入颜色数据

顶点着色器代码: #version 330 core layout(location 0) in vec3 aPos; layout(location 1) in vec3 aColor; out vec3 ourColor; void main(){gl_Position vec4(aPos.x, aPos.y, aPos.z, 1.0f);ourColoraColor; }片段着色器代码: #version 330 cor…

11-切片有什么用?【视频版】

目录 问题视频解答 问题 视频解答 点击观看: 11-切片有什么用?

学习 vue3版本

文章目录 创建各种函数setup注意点 ref函数总结 reactive总结 响应式vue2vue3总结 ref与reactive的比较计算属性监视watch的value的问题 watchEffect函数生命周期Hooks函数总结 toRef总结 其他CompositionApishallowReactive与shallowRefreadonly与shallowReadonlytoRaw与markR…

React Antd Form.List 组件嵌套多级动态增减表单 + 表单联动复制实现

Antd Form.List 组件嵌套多级动态增减表单 表单联动复制实现 一、业务需求 有一个页面的组件,其中一部分需要用到动态的增减 复制表单,然后就想起 了使用 Antd 的 Form.List 去完成这个功能。 这个功能的要求是: 首先是一个动态的表单&…

事后多重比较案例分析

一、案例介绍 由单因素方差分析案例中,为研究郁金对低张性缺氧小鼠存活时间的影响,将36只小鼠随机生成A、B以及 C 三组,每组12个,雌雄各半,分别以10g/kg、20g/kg、40g/kg三种不同剂量的郁金灌胃,各组小鼠均…

08-C++学习笔记-类与对象

🔟🔒 08-C学习笔记-类与对象 在本篇学习笔记中,我们将详细讲解C中的类与对象的概念和相关知识。类是C中一种重要的数据类型,它允许我们自定义数据结构和相应的操作。 📚 C类与对象详细讲解 ✨类的概念 类是一种用户…

黑客(网络安全)自学

前言: 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发. 3.有时多 google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答 .4.遇到实在搞不懂的,可以先放放,以后…

3dmax导出cad

3dmax2022 导出cad 导入arcmap 10.2 导出版本为AutoCAD 2007 DWG

玩转Matplotlib的10个高级技巧

Matplotlib是Python中流行的数据可视化库,仅使用简单的几行代码就可以生成图表。但是默认的方法是生成的图表很简单,如果想增强数据演示的影响和清晰度,可以试试本文总结的10个高级技巧,这些技巧可以将可视化提升到一个新的水平: …

Hyperledger Fabric网络快速启动

目录 1、网络服务配置 2、关联的docker-compose-base.yaml 各Peer节点容器设置如下信息。 3、被关联的Peer-base.yaml 4、启动网络 2、完成通道的创建 2.1将节点加入应用通道 更新锚节点 2.为什么要创建节点并将其加入应用通道中? 1、网络服务配置 由于要启动…

人工智能(pytorch)搭建模型16-基于LSTM+CNN模型的高血压预测的应用

大家好,我是微学AI,今天给大家介绍一下人工智能(pytorch)搭建模型16-基于LSTMCNN模型的高血压预测的应用,LSTMCNN模型搭建与训练,本项目将利用pytorch搭建LSTMCNN模型,涉及项目:高血压预测,高血…

鼠标点击切换图片(使用js中的src属性)

使用到的知识点&#xff1a; 模板字符串 js中的src属性 img.src ./images/${i}.jpg 效果展示&#xff1a; 具体代码实现&#xff1a; <body><div class"box" style"width:500px;height:300px;margin:100px auto;"><img src&quo…

Python中获取指定目录下所有文件名的方法

在《Python中文件名和路径的操作》中提到&#xff0c;os模块中的函数可以对文件进行操作。通过递归以及os模块中提供的函数&#xff0c;可以获取指定目录下所有的文件名。 1 基本流程 通过递归获取指定目录下所有文件名的基本流程&#xff0c;如图1所示。 图1 基本流程 2 函…

Web开播系统的技术演进

随着直播SaaS业务的深入发展&#xff0c;Web端开播的诉求变得越来越强烈&#xff0c;对比客户端开播工具如OBS&#xff0c;Web开播与SaaS平台亲和度高&#xff0c;可以让用户快速体验平台全流程&#xff0c;同时易于分享链接&#xff0c;快速连麦。因此&#xff0c;寻求更加稳定…

#10046. 「一本通 2.2 练习 2」OKR-Periods of Words(内附封面)

[POI2006] OKR-Periods of Words 题面翻译 对于一个仅含小写字母的字符串 a a a&#xff0c; p p p 为 a a a 的前缀且 p ≠ a p\ne a pa&#xff0c;那么我们称 p p p 为 a a a 的 proper 前缀。 规定字符串 Q Q Q&#xff08;可以是空串&#xff09;表示 a a a 的…

CMake 变量

目录 cmake普通变量 如何取消变量 cmake环境变量 cmake缓存变量 普通变量使用: 缓存变量使用: cmake变量的作用域 block() block demo: function 函数作用域简单 demo 高级变量 总结: 和其他语言一样,cmake完全可以看做是一种编程语言,他有变量,有函数等. cmake普通…

解决uview-plus组件样式修改不生效

一、问题描述 使用 ::v-deep 、/deep/ 等各种 deep 写法后&#xff0c;修改 uview-plus组件样式依旧不生效 二、解决方案 在子组件中写页面布局&#xff0c;在父组件中写CSS样式 目录结构&#xff1a; 父组件中&#xff1a;引入子组件&#xff0c;使用::v-deep修改样式 子组件…