02 Go语言开发REST API接口_20240728 课程笔记

概述

如果您没有Golang的基础,应该学习如下前置课程。

  • Golang零基础入门
  • Golang面向对象编程
  • Go Web 基础

基础不好的同学每节课的代码最好配合视频进行阅读和学习,如果基础比较扎实,则阅读本教程巩固一下相关知识点即可,遇到不会的知识点再看视频。

视频课程

最近发现越来越多的公司在用Golang了,所以精心整理了一套视频教程给大家,这个是其中的第4部,后续还会有很多。

视频已经录制完成,完整目录截图如下:
在这里插入图片描述

打个小广告,目前处于特价阶段,一节课只需要1块钱,24节课只需要24元哦。如果有需要,请前往我的淘宝店铺“Python私教”下单。

课程目录

  • 01 环境搭建
  • 02 关于年月日版本不被支持的说明
  • 03 返回JSON字典
  • 04 Go语言通过replace查找本地库的用法
  • 05 封装JsonMap方法
  • 06 使用封装的JsonMap方法
  • 07 优化JsonMap方法
  • 08 返回JSON数组
  • 09 封装ResponseJsonArr方法
  • 10 返回JSON结构体
  • 11 封装ResponseJsonStruct方法
  • 12 统一返回格式
  • 13 封装ResponseSuccess方法
  • 14 发送GET请求
  • 15 获取查询参数
  • 16 封装GetQuery和GetQueryInt方法
  • 17 获取获取查询参数的方式
  • 18 发送和获取表单参数
  • 19 封装GetForm方法
  • 20 封装SendForm方法
  • 21 发送和获取JSON
  • 22 获取路径参数
  • 23 发送PUT请求
  • 24 发送DELETE请求

完整代码

01 环境搭建

package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {fmt.Fprint(w, "Welcome!\n")
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

02 关于年月日版本不被支持的说明

03 返回JSON字典

package mainimport ("encoding/json""fmt""github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {// 声明返回的是JSON数据w.Header().Set("Content-Type", "application/json")m := make(map[string]string)m["a"] = "张三"m["b"] = "李四"// 将字段转换为JSONjsonBytes, err := json.Marshal(m)if err != nil {fmt.Println(err)fmt.Fprintf(w, err.Error())return}fmt.Fprint(w, string(jsonBytes))
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

04 Go语言通过replace查找本地库的用法

05 封装JsonMap方法

06 使用封装的JsonMap方法

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {m := make(map[string]interface{})m["a"] = "张三333"m["b"] = "李四333"zdpgo_httprouter.ResponseJsonMap(w, m)
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

07 优化JsonMap方法

08 返回JSON数组

package mainimport ("encoding/json""fmt""github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {// 声明返回的是JSON数据w.Header().Set("Content-Type", "application/json")var arr []interface{}arr = append(arr, "张三")arr = append(arr, "李四")arr = append(arr, "王五")// 将字段转换为JSONjsonBytes, err := json.Marshal(arr)if err != nil {fmt.Fprintf(w, err.Error())return}// 返回JSON信息fmt.Fprint(w, string(jsonBytes))
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

09 封装ResponseJsonArr方法

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {var arr []interface{}arr = append(arr, "张三333")arr = append(arr, "李四333")arr = append(arr, "王五333")zdpgo_httprouter.ResponseJsonArr(w, arr)
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

10 返回JSON结构体

package mainimport ("encoding/json""fmt""github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {// 声明返回的是JSON数据w.Header().Set("Content-Type", "application/json")u := User{"张三", 33}// 将字段转换为JSONjsonBytes, err := json.Marshal(u)if err != nil {fmt.Fprintf(w, err.Error())return}// 返回JSON信息fmt.Fprint(w, string(jsonBytes))
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

11 封装ResponseJsonStruct方法

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {u := User{"张三333", 333}zdpgo_httprouter.ResponseJsonStruct(w, u)
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

12 统一返回格式

package mainimport ("encoding/json""fmt""github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type SuccessResult struct {Code    int         `json:"code"`Status  bool        `json:"status"`Message string      `json:"message"`Data    interface{} `json:"data,omitempty"`
}type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {// 声明返回的是JSON数据w.Header().Set("Content-Type", "application/json")u := User{"张三", 33}s := SuccessResult{10000, true, "success", u}// 将字段转换为JSONjsonBytes, err := json.Marshal(s)if err != nil {fmt.Fprintf(w, err.Error())return}// 返回JSON信息fmt.Fprint(w, string(jsonBytes))
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

13 封装ResponseSuccess方法

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {u := User{"张三333", 333}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}

14 发送GET请求

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {u := User{"张三333", 333}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("fmt""io""net/http"
)func main() {resp, err := http.Get("http://localhost:8888/")if err != nil {fmt.Println(err)return}body := resp.BodybodyBytes, err := io.ReadAll(body)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

15 获取查询参数

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""strconv""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {name := r.URL.Query().Get("name")age := r.URL.Query().Get("age")ageInt, _ := strconv.ParseInt(age, 10, 64)u := User{name, int(ageInt)}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("fmt""io""net/http"
)func main() {resp, err := http.Get("http://localhost:8888/?name=张三333&age=33")if err != nil {fmt.Println(err)return}body := resp.BodybodyBytes, err := io.ReadAll(body)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

16 封装GetQuery和GetQueryInt方法

17 获取查询参数的方式

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {name := zdpgo_httprouter.GetQuery(r, "name")age := zdpgo_httprouter.GetQueryInt(r, "age")u := User{name, age}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.GET("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("fmt""io""net/http"
)func main() {resp, err := http.Get("http://localhost:8888/?name=张三33&age=33")if err != nil {fmt.Println(err)return}body := resp.BodybodyBytes, err := io.ReadAll(body)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

18 发送和获取表单参数

package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""net/http""strconv""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {r.ParseForm()fmt.Println(r.PostForm)name := r.PostForm.Get("name")age := r.PostForm.Get("age")ageInt, _ := strconv.ParseInt(age, 10, 64)u := User{name, int(ageInt)}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.POST("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("bytes""fmt""io""log""net/http""net/url"
)func main() {targetUrl := "http://localhost:8888/"// 用url.values方式构造form-data参数formValues := url.Values{}formValues.Set("name", "张三")formValues.Set("age", "23")formDataStr := formValues.Encode()formDataBytes := []byte(formDataStr)formBytesReader := bytes.NewReader(formDataBytes)//生成post请求client := &http.Client{}req, err := http.NewRequest("POST", targetUrl, formBytesReader)if err != nil {// handle errorlog.Fatal("生成请求失败!", err)return}//注意别忘了设置headerreq.Header.Set("Content-Type", "application/x-www-form-urlencoded")// Do方法发送请求resp, err := client.Do(req)body2 := resp.BodybodyBytes, err := io.ReadAll(body2)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

19 封装GetForm方法

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {name := zdpgo_httprouter.GetForm(r, "name")age := zdpgo_httprouter.GetFormInt(r, "age")u := User{name, age}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.POST("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("bytes""fmt""io""log""net/http""net/url"
)func main() {targetUrl := "http://localhost:8888/"// 用url.values方式构造form-data参数formValues := url.Values{}formValues.Set("name", "张三")formValues.Set("age", "23")formDataStr := formValues.Encode()formDataBytes := []byte(formDataStr)formBytesReader := bytes.NewReader(formDataBytes)//生成post请求client := &http.Client{}req, err := http.NewRequest("POST", targetUrl, formBytesReader)if err != nil {// handle errorlog.Fatal("生成请求失败!", err)return}//注意别忘了设置headerreq.Header.Set("Content-Type", "application/x-www-form-urlencoded")// Do方法发送请求resp, err := client.Do(req)body2 := resp.BodybodyBytes, err := io.ReadAll(body2)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

20 封装SendForm方法

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {name := zdpgo_httprouter.GetForm(r, "name")age := zdpgo_httprouter.GetFormInt(r, "age")u := User{name, age}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.POST("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""io"
)func main() {targetUrl := "http://localhost:8888/"formData := map[string]string{"name": "张三","age":  "23",}resp, err := zdpgo_httprouter.SendForm(targetUrl, formData)body2 := resp.BodybodyBytes, err := io.ReadAll(body2)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

21 发送和获取JSON

package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {var u Usererr := zdpgo_httprouter.GetJson(r, &u)if err != nil {fmt.Fprintf(w, "err:%v", err)return}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.POST("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""io"
)func main() {targetUrl := "http://localhost:8888/"formData := map[string]interface{}{"name": "张三","age":  23,}resp, err := zdpgo_httprouter.SendJson("POST", targetUrl, formData)body2 := resp.BodybodyBytes, err := io.ReadAll(body2)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

22 获取路径参数

package mainimport ("github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)func Index(w http.ResponseWriter, r *http.Request, ps zdpgo_httprouter.Params) {id := ps.ByName("id")data := map[string]interface{}{"id":   id,"name": "张三","age":  23,}zdpgo_httprouter.ResponseSuccess(w, data)
}func main() {router := zdpgo_httprouter.New()router.GET("/:id", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("fmt""io""net/http"
)func main() {targetUrl := "http://localhost:8888/3"resp, err := http.Get(targetUrl)body2 := resp.BodybodyBytes, err := io.ReadAll(body2)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

23 发送PUT请求

package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {var u Usererr := zdpgo_httprouter.GetJson(r, &u)if err != nil {fmt.Fprintf(w, "err:%v", err)return}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.PUT("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""io"
)func main() {targetUrl := "http://localhost:8888/"formData := map[string]interface{}{"name": "张三","age":  23,}resp, err := zdpgo_httprouter.SendJson("PUT", targetUrl, formData)body2 := resp.BodybodyBytes, err := io.ReadAll(body2)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

24 发送DELETE请求

package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""net/http""time"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func Index(w http.ResponseWriter, r *http.Request, _ zdpgo_httprouter.Params) {var u Usererr := zdpgo_httprouter.GetJson(r, &u)if err != nil {fmt.Fprintf(w, "err:%v", err)return}zdpgo_httprouter.ResponseSuccess(w, u)
}func main() {router := zdpgo_httprouter.New()router.DELETE("/", Index)server := &http.Server{Addr:         "0.0.0.0:8888",Handler:      router,ReadTimeout:  5 * time.Second,WriteTimeout: 5 * time.Second,}server.ListenAndServe()
}
package mainimport ("fmt""github.com/zhangdapeng520/zdpgo_httprouter""io"
)func main() {targetUrl := "http://localhost:8888/"formData := map[string]interface{}{"name": "张三","age":  23,}resp, err := zdpgo_httprouter.SendJson("DELETE", targetUrl, formData)body2 := resp.BodybodyBytes, err := io.ReadAll(body2)if err != nil {fmt.Println(err)return}fmt.Println(string(bodyBytes))
}

总结

本套教程主要讲解Go REST API开发的基础知识,特别是讲解了httprouter的用法以及一些便捷函数的封装,并附上了完整的实战代码。

通过本套课程,能帮你入门Go REST API 接口开发,写一些简单的API程序。

如果您需要完整的源码,打赏20元即可。

人生苦短,我用Python,我是您身边的Python私教~

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

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

相关文章

探索Python监控之眼:watchdog库深度解析

文章目录 探索Python监控之眼:watchdog库深度解析1. 引言:为何选择watchdog?2. watchdog简介3. 安装watchdog库4. 基本函数与使用方法4.1 初始化监控器4.2 监控文件的创建4.3 监控文件的删除4.4 监控目录的创建4.5 监控目录的删除 5. 场景应用…

IoTDB 入门教程 实战篇②——MQTT集成

文章目录 一、前文二、配置参数三、开放端口四、MQTT客户端连接五、推送数据六、查询数据八、参考 一、前文 IoTDB入门教程——导读 IoTDB时序数据库内置MQTT服务器,允许远程设备将消息直接发送到IoTDB内置的MQTT服务器,并可以直接存入IoTDB时序数据库。…

gitee的远程连接与公钥SSH的连接

目录 1. 登录注册gitee1.1 登录注册1.2 创建仓库 2. 远程连接3. 公钥连接4. 参考链接 1. 登录注册gitee 1.1 登录注册 gitee官网 进入后进行登录注册 1.2 创建仓库 2. 远程连接 在你想要上传文件的文件夹中进行git初始化(我在其他文章已经写过,链接…

新手小白,如何新建一个springboot的web项目?

第一步:打开软件,点击file,点击new 然后选择module,在右侧选择springboot 第二步:选择配置和JDK以及java版本 ①选择maven类型 ②选择JDK1.8版本 ③选择java8版本 ④选择jar包类型 http://t.csdnimg.cn/XeplRhttp:…

ICMPv6与DHCPv6之网络工程师软考中级

ICMPv6概述 ICMPv6是IPv6的基础协议之一。 在IPv6报文头部中,Next Header字段值为58则对应为ICMPv6报文。 ICMPv6报文用于通告相关信息或错误。 ICMPv6报文被广泛应用于其它协议中,包括NDP、Path MTU发现机制等 ICMPv6控制着IPv6中的地址自动配置、地址…

tarojs项目启动篇

TaroJS 是一个开放式跨端开发解决方案,使用 React 语法规范来开发多端应用(包括小程序、H5、React Native 等)。它可以帮助开发者高效地构建出在不同端上运行一致的应用。以下是启动 TaroJS 项目(本来就有的旧项目)的步…

OTA远程升级语音芯片”在线更新语音内容的方式有哪几种?分别如何使用及有什么优势?

一:【在板更新】在PCBA上预留语音芯片烧录口,通过配套下载器更新语音芯片中的语音文件。 如何使用,有什么优势? 1.研发设计阶段、调试阶段可以使用下载器更换PCBA上面的语音文件,无需重新购买IC,大大缩短项目周期。 2.产品一样,但是需要出口到不同国…

request编码方式Content-Type以及params和data传参

编码x-www-form-urlencoded Content-Type: application/x-www-form-urlencoded 是一种HTTP头部信息,用于指定请求或响应正文的内容类型。 具体来说: Content-Type 是HTTP头部字段,它指示了随后发送或接收的实体正文的媒体类型。 applicati…

Mybatis框架基础知识

Mybatis 1.1什么是Mybatis 1.MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。 2.MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 3.MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO…

redis的使用场景-热点数据缓存

1.什么是缓存? 把一些经常访问的数据放入缓存中,减少访问数据库的频率,减少数据库的压力,从而提高程序的性能。【内存中存储】 2.缓存的原理 通过上图可以看出程序首先访问缓存,如果缓存中有访问的数据会直接方会给客…

shell-awk文本处理工具

1、awk概述 AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。 它是专门为文本处理设计的编程语言,也是行处理软件,通常用于扫描、过滤、统计汇总工作 数据可以来自标准输入也可以是管道或文件 在 linux 上常用的是 gawk,awk …

NSS [NSSRound#18 Basic]easy_rw

NSS [NSSRound#18 Basic]easy_rw 题目描述:弱口令就完事了 入口:/dolphinscheduler 靶机启动需要1分钟。 这题有两种做法。CVE-2023-48796、CVE-2024-23320 先说CVE-2023-48796 Apache DolphinScheduler是一个分布式、易扩展、可视化的工作流任务调度…

【redis】一致性hash算法和hash槽

普通hash取模 直接hash(key)%N , N为机器的数量,但不利于集器扩容或者缩容 一致性hash算法和hash槽 一致性hash算法是在redis 分片中使用,hash槽在redis cluster(集群)中使用 Redis一致性hash:Redis一致性hash是为…

Netdevops入门之Telnetlib语法案例

1、Telnetlib模块: 支持telnet/ssh远程访问的模块很多,常见的有telnetlib、ciscolib、paramiko、netmiko、pexpect,其中telnetlib和ciscolib对应telnet协议,后面3个对应SSH协议。 ①-通过ENSP环境搭建实验环境 ②-基础语法-telnetlib案例1&…

16现代循环神经网络—深度循环与双向循环

目录 1.深度循环神经网络回顾:循环神经网络总结简洁代码实现2.双向循环神经网络隐马尔可夫模型中的动态规划双向模型模型的计算代价及其应用总结代码实现1.深度循环神经网络 回顾:循环神经网络 如何将循环神经网络变深,以获得更多的非线性? 通过添加多个隐藏层的方式来实现…

解决git每次push代码到github都需要输入用户名以及密码

产生原因: 出现以上情况的主要原因在于采用的是 https 方式提交代码, 如果采用的是 ssh 方式只需要在版本库中添加用户的 sha 的key就可以实现提交时无需输入用户名和密码。 解决方法 在终端中使用以下命令删除原先已经建立的http的链接方式&#xff0c…

git实践汇总【配置+日常使用+问题解决】

**最初配置步骤:** git config --global user.name "yournemae" git config --global user.email "yourmail" git config -l ssh-keygen -t rsa -C “xxx.xxxx.EXTcccc.com” git config --global ssh.variant ssh $ git clone git仓库路径 git…

洗地机哪家好?四款洗地机好洗地机的品牌推荐

随着“懒人经济”的兴起,洗地机作为家居清洁领域的革新者,正逐步融入越来越多家庭的生活之中。面对市场上繁多的洗地机品牌与型号,消费者往往感到难以抉择:“洗地机哪个牌子最佳?”为了解答这一疑问,本文精…

KubeSphere介绍及一键安装k8s

KubeSphere介绍 官网地址:https://kubesphere.io/zh/ KubeSphere愿景是打造一个以 Kubernetes 为内核的云原生分布式操作系统,它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用(plug-and-play)的集成&#xff0…

C++ | Leetcode C++题解之第284题窥视迭代器

题目&#xff1a; 题解&#xff1a; template <class T> class PeekingIterator : public Iterator<T> { public:PeekingIterator(const vector<T>& nums) : Iterator<T>(nums) {flag Iterator<T>::hasNext();if (flag) {nextElement Ite…