GoWeb从无到有(读取配置文件、gin、gorm)

news2025/8/7 9:24:13

GoWeb从无到有 – 读取配置文件、gin、gorm

创建go项目,结构如下
在这里插入图片描述

1. golang读取配置文件

  1. 引入包

    go get -u gopkg.in/ini.v1
    
  2. 在main.go的同级目录创建config文件夹,在文件夹中创建配置文件 config.ini

    # 项目配置
    [app]
    Port=8010
    # mysql配置
    [mysql]
    Url=username:password@tcp(xxx.xxx.xxx.xxx:3306)/scanner-web?charset=utf8mb4&parseTime=True&loc=Local
    
  3. 新建model包,在model包中创建Config结构体

    package model
    
    type Config struct {
    	Port     string
    	MysqlUrl string
    }
    
  4. 新建common文件夹,在文件夹下创建config包,在config包中读取配置文件参数

    package config
    
    import (
    	"gopkg.in/ini.v1"
    	"log"
    	"yy-data-processing/model"
    )
    
    var Cfg *ini.File
    var Config model.Config
    
    func init() {
    	var err error
    	Cfg, err = ini.Load("config/config.ini")
    	if err != nil {
    		log.Fatalf("Fail to parse 'config.ini': %v", err)
    	}
    
    	loadApp()
    	loadMysql()
    }
    
    func loadApp() {
    	Config.Port = Cfg.Section("app").Key("Port").String()
    }
    
    func loadMysql() {
    	Config.MysqlUrl = Cfg.Section("mysql").Key("Url").String()
    }
    

2. 整合gin

  1. 引入包

    go get -u github.com/gin-gonic/gin
    
  2. 初始化路由

    在根目录创建router包,创建initRouters.go

    package router
    
    import "github.com/gin-gonic/gin"
    
    var routersNoCheck = make([]func(v1 *gin.RouterGroup), 0)
    
    // 初始化所有的路由
    func InitRouters() *gin.Engine {
    	r := gin.Default()
        // 无需认证的路由
    	noCheck(r)
    	// 其他类型的路由...
        
    	return r
    }
    
    func noCheck(r *gin.Engine) {
    	v1 := r.Group("/api/v1")
    	for _, f := range routersNoCheck {
    		f(v1)
    	}
    }
    
  3. 启动服务

    在main.go中启动服务

    package main
    
    import (
    	"yy-data-processing/common/config"
    	"yy-data-processing/router"
    )
    
    func main() {
    	port := config.Config.Port
    	routers := router.InitRouters()
    	if err := routers.Run(":" + port); err != nil {
    		log.Fatalf("启动服务失败")
    	}
    }
    

3. 整合gorm

  1. 引入包

    go get -u github.com/jinzhu/gorm
    
    go get -u github.com/go-sql-driver/mysql
    
  2. 在common目录下新建database包,创建mysql.go

    package database
    
    import (
    	_ "github.com/go-sql-driver/mysql"
    	"github.com/jinzhu/gorm"
    	"log"
    	"yy-data-processing/common/config"
    )
    
    // 定义db全局变量
    var Db *gorm.DB
    
    func InitMysql() *gorm.DB {
    	var err error
    	url := config.Config.MysqlUrl
    	Db, err = gorm.Open("mysql", url)
    	if err != nil {
    		log.Fatalf("Connecting database failed: " + err.Error())
    	}
    
    	// 设置连接池
    	Db.DB().SetMaxIdleConns(5)
    	// 最大连接数
    	Db.DB().SetMaxOpenConns(10)
    	// 禁用后缀加s,结构体对应的表名不用带s
    	Db.SingularTable(true)
    
    	return Db
    }
    
  3. main方法中初始化数据库

    package main
    
    import (
    	"log"
    	"yy-data-processing/common/config"
    	"yy-data-processing/common/database"
    	"yy-data-processing/router"
    )
    
    func main() {
    	// 初始化路由
    	routers := router.InitRouters()
    
    	// 初始化mysql
    	db := database.InitMysql()
    	if db != nil {
    		log.Println("db连接成功")
    	}
    	defer db.Close()
    
    	port := config.Config.Port
    	if err := routers.Run(":" + port); err != nil {
    		log.Fatalf("启动服务失败: ", err)
    	}
    }
    

4. 编写api测试

  1. 在model包下新建user.go

    package model
    
    type User struct {
    	Id   int    `json:"id"`
    	Name string `json:"name"`
    	Age  int    `json:"age"`
    }
    
  2. 新建router目录,创建userRouter.go

    package router
    
    import (
    	"github.com/gin-gonic/gin"
    	"yy-data-processing/apis"
    )
    
    func init() {
    	routersNoCheck = append(routersNoCheck, registerUserRouter)
    }
    
    func registerUserRouter(v1 *gin.RouterGroup) {
    	apis := apis.UserApis{}
    	r := v1.Group("/user")
    	{
    		r.POST("/createUser", apis.SaveUser)
    		r.GET("/findUser", apis.FindUser)
    	}
    }
    
  3. 新建apis目录,创建userApis.go

    package apis
    
    import (
    	"github.com/gin-gonic/gin"
    	"net/http"
    	"yy-data-processing/model"
    	"yy-data-processing/service"
    )
    
    type UserApis struct {
    }
    
    func (u *UserApis) SaveUser(c *gin.Context) {
    
    	user := model.User{}
    	user.Name = "user1"
    	user.Age = 20
    	s := service.UserService{}
    	err := s.SaveUser(user)
    	if err != nil {
    		c.JSON(http.StatusBadRequest, gin.H{
    			"msg":   "新增数据失败",
    			"error": err,
    		})
    		return
    	}
    	c.JSON(http.StatusOK, gin.H{
    		"msg": "新增数据成功",
    	})
    }
    
    func (u *UserApis) FindUser(c *gin.Context) {
    	s := service.UserService{}
    	user := s.FindUser(6)
    	c.JSON(http.StatusOK, gin.H{
    		"msg":  "查询数据成功",
    		"data": user,
    	})
    }
    
  4. 新建service目录,创建userService.go

    package service
    
    import (
    	"yy-data-processing/common/database"
    	"yy-data-processing/model"
    )
    
    type UserService struct {
    }
    
    func (s *UserService) SaveUser(user model.User) error {
    	dbResp := database.Db.Create(&user)
    	if dbResp.Error != nil {
    		return dbResp.Error
    	}
    	return nil
    }
    
    func (s *UserService) FindUser(id int) model.User {
    	user := model.User{}
    	database.Db.Where("id = ?", id).Find(&user)
    	return user
    }
    
  5. 访问api测试
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

C++初阶 Stack和Queue的介绍和使用

作者:小萌新 专栏:C初阶 作者简介:大二学生 希望能和大家一起进步 本篇博客介绍:本篇博客会简单的介绍STL中的栈和队列 本章目标 复习下栈这种数据结构特点知道怎么使用STL中的栈复习下队列这种数据结构的特点知道怎么使用STL中…

多功能螯合剂FAPI-04-NH2,FAPI04-氨基,含有DOTA配体显示出良好的药代动力学

NH2-FAPI-04产品描述: FAPI是FAP的特异性抑制剂。在这些FAPI中,含有DOTA配体(FAPI-04)的[68Ga]Ga-DOTA-FAPI-04 PET/CT能显示出良好的体内药代动力学,导致快速kidney​清除和注射后10分钟至3小时的低背景活性。不久之后,[68Ga]Ga-…

Mybatis+Mybatis-plus+SpringBoot整合(完整版)

文章目录一、Mybatis(一)Mybatis简介1、Mybatis历史2、Mybatis特性3、Mybatis下载4、和其它持久化层技术对比(二)搭建Mybatis1、MySQL不同版本的注意事项2、创建Maven工程1、引入依赖3、创建MyBatis的核心配置文件3.1、核心配置文…

SpringMVC学习笔记

目录 SpringMVC 为什么出现了SpringMVC? 什么是SpringMVC? 简单使用 SpringMVC工作流程 设置bean加载控制 在服务器启动时加载SpringConfig 后台接受五种类型参数传递 REST风格 描述 RESTful入门 新建以下目录 实体类 控制器 统一异常处理 新建Code类用于记…

c#反序列化json

语句:JsonConvert.DeserializeObject(json); json字符串: [ { "id": "130000", "cityList": [ { "cityList": [ { …

Linux root用户忘记密码的恢复方法

日常运维工作中可能会遇到服务器忘记root密码的问题,本次以红帽8为例,讲解在忘记root密码后如何绕过密码登录然后重新设置密码的办法 目录 准备工作 问题复现 启动并进入引导 进入修复模式 修改用户密码文件 重置密码 准备工作 下载与系统匹配的…

Python编程 元组的创建

作者简介:一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.元组知识点 二.元组(tuple) 1.元组介绍(掌握) 2.元组创建(掌握) 3.…

第十四届蓝桥杯校模拟赛-编程大题详解+代码(二)

前言:这几天有不少小伙伴催促我尽快更新后五道编程题题解,然鄙人实在水平有限,实事求是,能力不足,不堪众望。思索良久,第九题有解题思路且已完成部分解题,但未完全完成,第十题尚未有…

python 数据挖掘与机器学习核心技术

近年来,Python编程语言受到越来越多科研人员的喜爱,在多个编程语言排行榜中持续夺冠。同时,伴随着深度学习的快速发展,人工智能技术在各个领域中的应用越来越广泛。机器学习是人工智能的基础,因此,掌握常用…

《FFmpeg Basics》中文版-11-格式之间转换

正文 ffmpeg工具的最常见用法是从一种音频或视频格式转换为另一种相关的格式。 格式参数在输出文件之前由-f选项设置,或者在输入文件之前也有原始输入,具体的可用格式信息在[显示帮助和功能]一章中列出来了。 多媒体格式介绍 文件格式 媒体格式是能够…

OpenSSH移植到Linux开发板

OpenSSH移植到Linux开发板 文章目录OpenSSH移植到Linux开发板前言一、移植zlib库二、 移植openssl库三、 移植openssh库1. 在开发板中创建目录2. 将文件拷贝到对应目录下3. 创建对应软连接4. 开发板上生成密钥文件5. 开启SSH前言 在Linux开发中,有时候需要远程登录…

BLE学习(2):广播包报文格式详解

文章目录1 广播通道2 广播包参考手册: BLUETOOTH SPECIFICATION Version 5.0为了能够充分理解蓝牙的广播,我们先了解一下BLE架构的GAP(Generic Access Profile)层。 GAP层提供决定蓝牙设备之间如何交互的框架,包括: 蓝牙设备的角…

PHP 底层的运行机制和工作原理

阅读目录阐述一、PHP的设计理念及特点PHP 为什么没有多线程?1、PHP 与多线程2、PHP是单线程,多进程模型3、 php为什么选择多进程,而不是多线程4、场景二、PHP 四层体系1、上层应用2、Sapi3、Extensions(扩展)4、Zend 引…

【目标检测】Fast R-CNN论文详细解读

目录:Fast R-CNN论文解读一、前言1. R-CNN的步骤及缺点2. SPP Net的步骤二、Fast R-CNN1. R-CNN的缺点2. SPPNet的缺点3. Fast R-CNN的优点4. Fast R-CNN的模型结构和训练流程5. 初始化预训练网络结构6. 微调7. 多任务损失函数8. ROI层的反向传播9. SGD超参数选择10…

Java后端面试到底要如何准备?

我把面试准备拆成以下几个步骤: 1.写简历 2.整理好自己最熟悉的项目,相对有代表性的项目。 3.整理自己的技术栈 4.收拾好自己的自我介绍 5.被八股文 6.模拟面试 7.针对模拟面试表现出来的问题进行改进 8.开始投投简历 本人 10 年开发经验&#…

jsp课程设计管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 课程设计管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使…

单片机毕业设计 stm32智能手环

文章目录1 简介1 项目背景意义2 系统方案的设计3 系统总体结构4 系统硬件设计4.1 主控模块4.2 姿态解算模块:MPU60504.3 DS3231实物图4.4 TFT显示模块4.5 硬件连接效果5 跌倒检测算法原理5.1 跌倒检测的判定流程5.2 关键算法实现1 简介 🔥 Hi&#xff0…

CIPU落地专有云:是“小众需求”还是“机会之门”?

2022 年 11 月,云栖大会主论坛,阿里巴巴集团副总裁、阿里云智能基础产品事业部负责人蒋江伟分享了阿里云专有云的一项新进展 —— CIPU 落地飞天企业版。在分析师峰会上,阿里巴巴集团研究员、阿里云专有云总经理刘国华也向分析师们详细介绍了…

双一流高校全球通邮经验:Coremail安全海外中继提升科研效率

在这个“后疫情时代”,高校间的国际交流合作更应架起桥梁,承担起文明交流互鉴的责任,邮件往来交流作为学术交流的重要工具,保障全球高校学术交流安全畅通,是Coremail针对高校教育邮件服务的重点之一。 针对高校行业面临…

python一键采集高质量陪玩,心动主播随心选......

人生苦短,我用python 北京时间11月6日上午,2022英雄联盟全球总决赛(S12)冠亚军决赛在美国旧金山大通中心球馆进行,随着DRX的成功夺冠,在全球进一步掀起了电竞热潮。 newzoo 《2022电竞市场报告》显示&…