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

Go的web开发Gin框架1(八)——Gin

一、重点内容:

知识要点有哪些?

1、了解Gin框架

2、导入使用Gin框架

3、尝试配合GORM开发

4、整合html,css,js

二、详细知识点介绍:

1、Gin框架介绍

​ Gin是一个golang的微框架,封装比较优雅,API友好,源代码比较明确。具有快速灵活,容错方便等特点。其实对于golang而言,web框架的依赖远比Python,Java之类的要小。自身的net/http足够简单,性能也非常不错。框架更像是一个常用函数或者工具的集合。借助框架开发,不仅可以省去很多常用的封装带来的时间,也有助于团队的编码风格和形成规范。

Gin官方文档地址: https://gin-gonic.com/zh-cn/docs/

2、安装Gin

要安装 Gin 软件包,需要先安装 Go 并设置 Go 工作区。

1.下载并安装 gin:

$ go get -u github.com/gin-gonic/gin
image-20230213202809495

2.将 gin 引入到代码中:

import "github.com/gin-gonic/gin"

3、初体验——创建一个get请求

代码:

package mainimport ("github.com/gin-gonic/gin""net/http"
)func main() {// 创建一个服务ginServer := gin.Default()// 添加一个get响应ginServer.GET("/hello", func(context *gin.Context) {context.JSON(http.StatusOK, gin.H{"msg": "hello world!"})})// 服务器端口err := ginServer.Run(":8082")if err != nil {return}
}

测试:

浏览器访问:localhost:8082/hello

image-20230213203941853

控制台日志:

image-20230213204026954

4、简单的GORM+Gin给前端发送MySQL中数据

代码:

package mainimport ("database/sql""github.com/gin-gonic/gin""github.com/jinzhu/gorm"_ "github.com/jinzhu/gorm/dialects/mysql""log""net/http""time"
)// User 数据库映射结构体
type User struct {ID           uintName         stringEmail        *stringAge          uint8Birthday     *time.TimeMemberNumber sql.NullStringActivatedAt  sql.NullTimeCreatedAt    time.TimeUpdatedAt    time.Time
}func main() {// 创建一个服务ginServer := gin.Default()// 数据库操作db, err := gorm.Open("mysql", "root:XXXXXX@tcp(127.0.0.1:3306)/mybatis?charset=utf8mb4&parseTime=True&loc=Local")if err != nil {log.Println(err)return}// 查询ID为2的数据var u Userfirst := db.Where("id=?", 2).First(&u)if first.Error != nil {log.Println(first.Error)}// 添加一个get响应ginServer.GET("/hello", func(context *gin.Context) {context.JSON(http.StatusOK, gin.H{"name": u.Name, "age": u.Age, "id": u.ID})})// 服务器端口err = ginServer.Run(":8082")if err != nil {return}
}

测试:

浏览器访问:

image-20230213205820817

控制台日志:

image-20230213205914460

数据库查看:

image-20230213210013324

可以看到成功将数据库的数据响应给浏览器了。

5、图标配置:

导入相应包:

$ go get -u github.com/thinkerou/favicon
image-20230213210646298

使用本地图标:

image-20230213211236435

代码:

package mainimport ("github.com/gin-gonic/gin""github.com/thinkerou/favicon""log""net/http"
)func main() {// 创建一个服务ginServer := gin.Default()// 使用图标ginServer.Use(favicon.New("./static/哔哩哔哩.png"))// 添加一个get响应ginServer.GET("/hello", func(context *gin.Context) {context.JSON(http.StatusOK, gin.H{"name": "李华", "age": 20})})// 服务器端口err := ginServer.Run(":8082")if err != nil {log.Panicln(err)return}
}

测试:

image-20230213211400835

6、RestFul API开发

get /user

post /user

put /user

delete /user

post测试

安装APIpost工具用于测试

代码:
package mainimport ("github.com/gin-gonic/gin""github.com/thinkerou/favicon""log""net/http"
)func main() {// 创建一个服务ginServer := gin.Default()// 使用图标ginServer.Use(favicon.New("./static/哔哩哔哩.png"))// 添加一个get响应ginServer.GET("/hello", func(context *gin.Context) {context.JSON(http.StatusOK, gin.H{"name": "李华", "age": 20})})// 添加一个post响应ginServer.POST("/user", func(context *gin.Context) {context.JSON(http.StatusOK, gin.H{"msg": "post user"})})// 服务器端口err := ginServer.Run(":8082")if err != nil {log.Panicln(err)return}
}
测试:
image-20230213213207181

put测试

同post测试:

代码:
ginServer.PUT("/user", func(context *gin.Context) {context.JSON(http.StatusOK, gin.H{"msg": "post user"})
})
测试:
image-20230213213436935

7、给前端响应html

创建html:

一般放在templates目录下:

image-20230213215005218

index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>go web</title>
</head>
<body>
<h1>Holle!!!
</h1>
后端发送的消息:
{{.msg}}
<img src="https://ts1.cn.mm.bing.net/th?id=ORMS.125d9efb147fe32b7990b8282e6bd509&pid=Wdp&w=612&h=304&qlt=90&c=1&rs=1&dpr=0.9333299994468689&p=0">
</body>
</html>

代码:

package mainimport ("github.com/gin-gonic/gin""github.com/thinkerou/favicon""log""net/http"
)func main() {// 创建一个服务ginServer := gin.Default()// 使用图标ginServer.Use(favicon.New("./static/哔哩哔哩.png"))// 加载htmlginServer.LoadHTMLGlob("templates/*")// 响应页面给前端ginServer.GET("/index", func(context *gin.Context) {context.HTML(http.StatusOK, "index.html", gin.H{"msg": "服务器发送的html",})})// 服务器端口err := ginServer.Run(":8082")if err != nil {log.Panicln(err)return}
}

测试:

image-20230213215249284

可以看到成功返回了html数据。

8、整合css和js到html然后响应给前端

创建css和js

image-20230213220504024

css:

image-20230213220527984

js:

image-20230213220546123

整合到html:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>go web</title>
<!--    链接 css和js--><link rel="stylesheet" href="../static/css/style.css"><script src="../static/js/common.js"></script>
</head>
<body>
<h1>Holle!!!
</h1>
后端发送的消息:
{{.msg}}
<img src="https://ts1.cn.mm.bing.net/th?id=ORMS.125d9efb147fe32b7990b8282e6bd509&pid=Wdp&w=612&h=304&qlt=90&c=1&rs=1&dpr=0.9333299994468689&p=0">
</body>
</html>

代码:

// 加载静态资源
ginServer.Static("/static", "./static")
// 响应页面给前端
ginServer.GET("/index", func(context *gin.Context) {context.HTML(http.StatusOK, "index.html", gin.H{"msg": "服务器发送的html",})
})

测试:

image-20230213220740331

可以看到已经响应。

image-20230213220828283

html也响应。

三、课后个人总结:

此处学习了go的Gin框架,了解了gin框架的强大,设置可以直接编译成exe文件跨平台运行。

相关文章:

Go的web开发Gin框架1(八)——Gin

一、重点内容&#xff1a; 知识要点有哪些&#xff1f; 1、了解Gin框架 2、导入使用Gin框架 3、尝试配合GORM开发 4、整合html&#xff0c;css&#xff0c;js 二、详细知识点介绍&#xff1a; 1、Gin框架介绍 ​ Gin是一个golang的微框架&#xff0c;封装比较优雅&…...

吴思进——复杂美创始人首席执行官

杭州复杂美科技有限公司创始人兼CEO, 本科毕业于浙江大学机械专业&#xff0c;辅修过多门管理课程&#xff1b;1997年获经济学硕士学位&#xff0c;有关对冲基金的毕业论文被评为优秀&#xff1b;2008年创办杭州复杂美科技有限公司。 吴思进 中国电子学会区块链委员会专家&…...

apk简单介绍(组成以及打包安装流程)

apk简单介绍APK 的组成apk安装流程app的启动过程apk打包流程AIDLAIDL介绍为什么要设计这门语言它有哪些语法&#xff1f;默认支持的数据类型包括什么是apk打包流程了解打包流程能做什么操作APK 的组成 APK 其实是一个 zip 类型的压缩包&#xff0c;而一个典型的 APK 通常都会包…...

ffmpeg学习笔记之SDL视频播放器

看了雷神的 100行代码实现最简单的基于FFMPEGSDL的视频播放器&#xff08;SDL1.x&#xff09; 后手痒难耐&#xff0c;决定将里面的代码重新建一个 首先建立一个空项目&#xff0c;新建一个Mysimplest.cpp的文件。在里面写代码 #include <stdio.h>extern "C" …...

【Git】合并多条 commit 注释信息

文章目录1、查看 commit 记录2、合并 commit 注释1、查看 commit 记录 # 3 指的是查看最近 3 次的 commit 记录&#xff0c;如果要查看多次的可以修改数字 # -3 不加&#xff0c;则表示查看所有 commit 记录&#xff0c;一般还是用数字去指定 git log -32、合并 commit 注释 …...

【gcc/g++】程序的翻译(.c -->.exe)

环境&#xff1a;centos7.6&#xff0c;腾讯云服务器Linux文章都放在了专栏&#xff1a;【Linux】欢迎支持订阅&#x1f339;前言我们在写完代码运行时会发现生成了一个.exe的可执行程序&#xff0c;那么该程序是如何形成的呢&#xff1f;本次章节将在linux下用编译器gcc进行一…...

电话号码的字母组合-力扣17-java

一、题目描述给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。示例 1&#xff1a;输入&#xff1a;digits "23"输出…...

Archery-SQL审核查询平台

Archery-SQL审核查询平台 文章目录Archery-SQL审核查询平台一、功能列表介绍1.1、SQL审核MySQL实例非MySQL实例审核执行分离SQL工单自动审批、高危语句驳回快速上线其他实例定时执行1.2、SQL查询多类型数据库支持授权管理页面体验1.3、SQL优化慢日志管理SQL语句优化1.4、实例管…...

MySQL8.0安装教程

文章目录1.官网下载MySQL2.下载完记住解压的地址&#xff08;一会用到&#xff09;3.进入刚刚解压的文件夹下&#xff0c;创建data和my.ini在根目录下创建一个txt文件&#xff0c;名字叫my&#xff0c;文件后缀为ini&#xff0c;之后复制下面这个代码放在my.ini文件下&#xff…...

一文详解工业知识模型互联平台MoHub

1月8日&#xff0c;MWORKS 2023产品发布会落下帷幕。会上&#xff0c;同元软控隆重推出了云原生的工业知识模型互联平台MoHub&#xff0c;引起广泛关注。本文将从服务定位、架构方案、核心服务、持续运营等方面对MoHub平台进行全面介绍。1 MoHub平台的服务定位装备数字化的必要…...

MySQL入门篇-MySQL表连接小结

备注:测试数据库版本为MySQL 8.0 这个blog我们来聊聊常见的表连接的方法 测试数据: create table t1(id int); create table t2(id int);insert into t1 values(1); insert into t1 values(2);insert into t2 values(2); insert into t2 values(3); commit;内连接 --求交集 …...

使用纹理(Textures)

当物体表面并非是纯色的时候&#xff0c;比如带波点&#xff0c;斑纹或者表面有刮痕或被裂纹等&#xff0c;这些效果该如何实现呢&#xff1f; 这里我们需要提到一个概念是贴图&#xff08;Maps&#xff09;。Maps是覆盖在游戏物体上的2D图片&#xff0c;用来设置表面的颜色、s…...

android 11 添加开机铃声

需求&#xff1a;在11.0在定制化系统中&#xff0c;默认是没有开机铃声的&#xff0c;有客户提出需要要添加开机铃声&#xff0c;所以为了完成需求&#xff0c;就来实现这一个功能关于开机铃声 都是在bootanimation_main.cpp 这里面负责管理。添加添加开机铃声的核心类framewor…...

操作系统考试突击复习笔记

0 基础概念补充特权命令&#xff1a;有特殊权限的指令&#xff0c;比如清内存、置时钟、分配系统资源、修改虚拟内存的段表和页表&#xff0c;修改用户的访问权限。系统调用&#xff1a;操作系统为应用程序提供的使用接口&#xff0c;可以理解为一种可供应用程序调用的特殊函数…...

java8函数式接口分布式事务简单实现方式

import java.util.List; import java.util.function.Function;/*** @ClassName TransactionFunctionDTO* @Description* @Author SD.LIU* @Date 2023/2/13 22:41* @Version 1.0**/ public class TransactionFunctionDTO...

最后一个单词的长度-力扣58-java

一、题目描述给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。示例 1&#xff1a;输入&#xff1a;s "Hello World"输出&#x…...

Java开发学习(四十九)----MyBatisPlus更新语句之乐观锁

1、概念 在讲解乐观锁之前&#xff0c;我们还是先来分析下问题: 业务并发现象带来的问题:秒杀 假如有100个商品或者票在出售&#xff0c;为了能保证每个商品或者票只能被一个人购买&#xff0c;如何保证不会出现超买或者重复卖 对于这一类问题&#xff0c;其实有很多的解决方…...

力扣SQL刷题11

目录标题1194. 锦标赛优胜者--做出来了1225. 报告系统状态的连续日期-勉强1159. 市场分析 II1205. 每月交易II1194. 锦标赛优胜者–做出来了 题型&#xff1a;看题 解答&#xff1a;先处理matches表&#xff0c;整出分数列和players表连接 注意点&#xff1a; union all 时…...

Fluent Python 笔记 第 9 章 符合 Python 风格的对象

得益于 Python 数据模型&#xff0c;自定义类型的行为可以像内置类型那样自然。实现如此自然的行为&#xff0c;靠的不是继承&#xff0c;而是鸭子类型(duck typing)&#xff1a;我们只需按照预定行为实现对象所需的方法即可。 9.1 对象表示形式 实现 __repr__ 和 __str__ 特…...

档案管理数字化,成功的领导者,往往只问这3个问题

随着数字经济时代的到来&#xff0c;信息技术的更迭演进&#xff0c;逐渐改变了企业的办公业务流程&#xff0c;传统的办公业务模式已不能满足当前的企业业务需求。数字化转型成为当下企业的必选项。随着公司部门架构的日益复杂&#xff0c;流程繁多&#xff0c;产生海量的企业…...

自学软件测试从哪里开始?给还在迷茫的人一条出路

这两天和朋友谈到软件测试的发展&#xff0c;其实软件测试已经在不知不觉中发生了非常大的改变&#xff0c;前几年的软件测试行业还是一个风口&#xff0c;随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业&#xff0c;目前软件测试行业“缺口”已经基本饱和。当然&a…...

配置MyBatis Plus 的分页查询功能

配置MyBatis Plus 的分页查询功能一. 回顾Mysql分页查询二. 配置MyBatis Plus 分页功能2.1 定义分页拦截器2.2 进行分页查询 selectPage()三. 开启MyBatis Plus的运行日志一. 回顾Mysql分页查询 limit 是MySQL当中特有的&#xff01;其他数据库没有&#xff01;不通用&#xf…...

Solon2 开发之插件,四、插件热插拔管理机制(H-Spi)

插件热插拔管理机制&#xff0c;简称&#xff1a;H-Spi。是框架提供的生产时用的另一种高级扩展方案。相对E-Spi&#xff0c;H-Spi 更侧重隔离、热插热拔、及管理性。 应用时&#xff0c;是以一个业务模块为单位进行开发&#xff0c;且封装为一个独立插件包。 1、特点说明 所…...

从react源码看hooks的原理

React暴露出来的部分Hooks //packages/react/src/React.js export {...useCallback,useContext,useEffect,useLayoutEffect,useMemo,useReducer,useRef,useState,... }功能描述 useState、useReducer: 状态值相关useEffect、useLayoutEffect: 生命周期相关useContext: 状态共…...

空间尺寸对迭代次数的影响

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) ( A, B )---4*30*2---( 1, 0 )( 0, 1 ) 做4个训练集尺寸分别为3行3列&#xff0c;3行4列&#xff0c;4行3列和2行4列的网络。简写为3*3&#xff0c;3*4&#xff0c;4*3&#xff0c;2*4. 保持这4个网络差值结构的形态一致&#xff0c;…...

mininet+flowvisor+floodlight实现网络切片功能

ininetflowvisorfloodlight实现网络切片功能 这个项目所使用的软件flowvisor 和floodlight 都已经过时了网上能找到的资料太少了&#xff0c;整个项目搭建过程中遇到的坑太多了。花了大量的的时间。 有什么问题可提出来&#xff0c;如果我会的话一定会耐心解答的 此项目主要采…...

【C++】十分钟带你入门C++

目录零 内容概括一 C关键字二 命名空间2.1 命名空间定义2.2 命名空间的使用三 C输入和输出四 缺省参数4.1 缺省参数的概念4.2 缺省参数分类五 函数重载5.1 函数重载的概念六 引用6.1 引用概念6.2 引用特性6.3 常引用6.4 使用场景6.5 效率比较6.6 引用和指针的区别七 内联函数7.…...

kettle利用excel文件增量同步一个库的数据(多表一次增量同步)

利用excel文件增量同步一个库的数据 现在有sqlserver和mysql两个库上的表在进行同步&#xff0c;mysql上的是源表&#xff0c;sqlserver上是目标表。 mysql : sqlserver : 可以看到sqlserver上表的最近一次同步日期分别是 pep表&#xff1a; 2022-10-23 14:19:00.000 stu_…...

面试题:android中A Activity 打开B Activity,为什么A Activity的onStop()方法最后被调用

如下是一段典型的Activity间切换的日志&#xff0c;从A Activity切换到B Activity&#xff1a;10-17 20:54:42.247: I/com.example.servicetest.AActivity(5817): onCreate() 1166919192 taskID66 10-17 20:54:42.263: I/com.example.servicetest.AActivity(5817): onStart()…...

百度版本gactgpt即将来临,gpt人工智能机器横空出世

百度版本gactgpt即将来临&#xff0c;gpt人工智能机器横空出世&#xff0c;“一言”为定&#xff01;百度版ChatGPT确认&#xff01;李彦宏OKR曝光&#xff0c;率先应用于收索业务 gactCBT 大获&#xff0c;当下极有可能成为人工智能的 iPhone 时刻。为了在这场人工智能竞赛中…...

南宁网站建设gxskm/百度竞价员

【故障现象】伪造源地址***中&#xff0c;***机器向受害主机发送大量伪造源地址的TCP SYN报文&#xff0c;占用安全网关的NAT会话资源&#xff0c;最终将安全网关的NAT会话表占满&#xff0c;导致局域网内所有人无法上网。【快速查找】在WebUI系统状态NAT统计NAT状态&#xff0…...

建设人才信息网是什么网站/南宁网站公司

文章目录1.1 为什么要过渡到IPv6原因1&#xff1a;IPv4地址耗尽原因2&#xff1a;让只使用IPv6的客户访问原因3&#xff1a;提升性能原因4&#xff1a;加固当前的网络。1.2 IPv6的历史1.3 IPv6的优点1.极大扩展的地址空间:2.无状态自动配置3.消除了NAT/PAT&#xff08;网络地址…...

免费空间asp网站/企业网络营销策略

目录 目录软件环境RHEV简介RHEV与KVM的区别RHEV的组成RHEV-MManagerRHEV-HHypervisor 虚拟机管理程序存储RHEV的架构LDAPIPAADWeb ServicePostgreSQLVDSMJBoss软件环境 系统 RHEL 6.4软件 RHEV 3.1RHEV简介 RHEV(Red Hat Enterprise virtualization)红帽企业虚拟化&#xff0c;…...

广州营销网站建设公司/百度健康人工客服电话24小时

网络通信中TCP出现的黏包以及解决方法 socket 模拟黏包参考文章&#xff1a; &#xff08;1&#xff09;网络通信中TCP出现的黏包以及解决方法 socket 模拟黏包 &#xff08;2&#xff09;https://www.cnblogs.com/H1050676808/p/10226438.html 备忘一下。...

禅城网站建设费用/怎样开网站

Material Theme提供了一下功能&#xff1a;1、系统widgets可以设置调色板2、系统widgets的触摸反馈3、Activity过渡动画你可以根据你品牌的色彩来定义Material Theme&#xff0c;可以使用Material Theme的色彩为status bar、action bar着色。参考下图。系统Widgets有新的设计和…...

wordpress插件使用数量/长沙网站seo优化排名

table列表勾选实现上面列表勾选&#xff0c;点击确认按钮&#xff0c;到下面列表点击人员设置按钮出现弹窗弹窗内容 htmljsJSON.JS数据源实现上面列表勾选&#xff0c;点击确认按钮&#xff0c;到下面列表 点击人员设置按钮出现弹窗 <a-table:columns"columns":d…...