[golang gin框架] 4.自定义Model以及Gin 文件上传

news/2024/4/26 6:30:40/文章来源:https://blog.csdn.net/zhoupenghui168/article/details/129116094

一.Gin 中自定义 Model

  1. 关于 Model

如果应用非常简单的话,我们可以在 Controller 里面处理常见的业务逻辑,但是如果
有一个功能想在多个控制器、或者多个模板里面复用的话,那么就可以把公共的功
能单独抽取出来作为一个模块(Model),Model 是逐步抽象的过程,一般会在 Model
里面封装一些公共的方法让不同 Controller 使用,也可以在 Model 中实现和数据库打交道

2.Model 里面封装公共的方法

新建 models/ tools.go

package modelsimport ("crypto/md5""fmt""time"
)//时间戳转换成日期函数
func UnixToTime(timestamp int) string {t := time.Unix(int64(timestamp), 0)return t.Format("2006-01-02 15:04:05")
}//日期转换成时间戳
func DateToUnix(str string) int64 {template := "2006-01-02 15:04:05"t, err := time.ParseInLocation(template, str, time.Local)if err != nil {return 0}return t.Unix()
}//获取当前时间戳
func GetUnix() int64 {return time.Now().Unix()
}//获取当前日期
func GetDate() string  {template := "2006-01-02 15:04:05"return time.Now().Format(template)
}//获取年月日
func GetDay() string {template := "20060102"return time.Now().Format(template)
}func Md5(str string) string {data := []byte(str)return fmt.Sprintf("%x\n", md5.Sum(data))
}
func Hello(in string) (out string) {out = in + "world"return
}

3.控制器中调用 Model

package controllers
import ("gindemo/models"
)day := models.GetDay()

4.调用 Model 注册全局模板函数

(1).main.go中

package mainimport ("fmt""gindemo/models""github.com/gin-gonic/gin""html/template"
)//main中的公共方法
func Println(str1 string, str2 string) string {return str1 + str2
}func main() {//初始化路由,会设置默认中间件:engine.Use(Logger(), Recovery()),可以使用gin.New()来设置路由r := gin.Default()//自定义模板函数,必须在r.LoadHTMLGlob前面r.SetFuncMap(template.FuncMap{"UnixToTime": models.UnixToTime, //注册模板函数"Println":    Println,})//加载templates中所有模板文件, 使用不同目录下名称相同的模板,注意:一定要放在配置路由之前才得行r.LoadHTMLGlob("templates/**/*")//配置静态web目录 第一个参数表示路由,第二个参数表示映射的目录r.Static("/static", "./static")...
}

(2).控制器,模板中:方式一

控制器UserController

func (c UserController) Add(c *gin.Context) {c.HTML(http.StatusOK, "admin/user/add.html", gin.H{ "now": models.GetUnix(), })
}

模板admin/user/add.html

<h2>{{.now | unixToDate}}</h2>

(3).控制器,模板中:方式二

控制器defaultController.go

package ityingimport (_ "fmt""gindemo/models""github.com/gin-gonic/gin""net/http"
)type DefaultController struct {}func (con DefaultController) Index(c *gin.Context) {fmt.Println(models.GetDay())c.HTML(http.StatusOK, "default/index.html",gin.H{"msg":"我是一个msg","t": 1629788010,})
}

模板default/index.html

<!-- 相当于给模板定义一个名字, define end 必须成对出现 -->
{{ define "default/index.html" }}<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" href="/static/css/base.css"><title>首页</title></head><body>{{ template "public/page_header.html" .}}<h2>{{.msg}}</h2><h3>{{UnixToTime .t}}</h3>{{ template "public/page_footer.html" .}}</body></html>
{{end}}

5.Golang Md5 加密

打开 golang 包对应的网站:https://pkg.go.dev/,搜索 md5

方法一

package modelsimport ("crypto/md5"
)func Md5(str string) string {data := []byte(str)return fmt.Sprintf("%x\n", md5.Sum(data))
}

方法二

package modelsimport ("crypto/md5"
)func Md5(str string) string {h := md5.New()io.WriteString(h, str)return fmt.Sprintf("%x\n", h.Sum(nil))
}

二.Gin 文件上传

注意:需要在上传文件的 form 表单上面需要加入 enctype="multipart/form-data"

1.单文件上传

文档:https://gin-gonic.com/zh-cn/docs/examples/upload-file/single-file/

官方案例:

func main() {router := gin.Default()// 为 multipart forms 设置较低的内存限制 (默认是 32 MiB)router.MaxMultipartMemory = 8 << 20  // 8 MiBrouter.POST("/upload", func(c *gin.Context) {// 单文件file, _ := c.FormFile("file")log.Println(file.Filename)dst := "./" + file.Filename// 上传文件至指定的完整文件路径c.SaveUploadedFile(file, dst)c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename))})router.Run(":8080")
}

项目中实现文件上传

(1).定义模板 需要在上传文件的 form 表单上面需要加入 enctype="multipart/form-data"

<!-- 相当于给模板定义一个名字, define end 必须成对出现 -->
{{ define "admin/user/add.html" }}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>{{.title}}</title>
</head>
<body>
<h2>演示文件上传</h2>
<form action="/admin/user/doUpload" method="post" enctype="multipart/form-data">用户名:<input type="text" name="username" placeholder="用户名"><br/><br/>头像: <input type="file" name="face"><br/><br/><input type="submit" value="提交">
</form>
</body>
</html>
{{ end }}

(2).定义业务逻辑

package adminimport ("gindemo/models""github.com/gin-gonic/gin""net/http""os""path""strconv"
)//添加:单文件上传
func (con UserController) Add(c *gin.Context) {c.HTML(http.StatusOK, "admin/user/add.html", gin.H{"title": "添加用户",})
}//单文件上传
func (con UserController) DoUpload(c *gin.Context) {//获取表单中提交的usernameusername := c.PostForm("username")//获取文件file, err := c.FormFile("face")//判断上传文件上否存在if err != nil {//说明上传文件不存在c.JSON(http.StatusInternalServerError, gin.H{"success": "fail","message": err.Error(),})return}//设置需要上传的文件目录 file.Filename 获取文件名; "./static/upload" 是基于main.go文件路由的dst := path.Join("./static/upload", file.Filename)//上传文件到指定目录c.SaveUploadedFile(file, dst)c.JSON(http.StatusOK, gin.H{"success": "true","username": username,"dst": dst,})
}

(3).增加路由配置

package routersimport ("gindemo/controllers/admin""gindemo/middlewares""github.com/gin-gonic/gin"
)//设置admin后台路由
func AdminRoutersInit(r *gin.Engine) {//路由分组: 配置全局中间件:middlewares.InitMiddlewareadminRouters := r.Group("/admin", middlewares.InitMiddleware){//单文件上传adminRouters.POST("/user/doUpload", admin.UserController{}.DoUpload)      }
}

2.多文件上传-不同名字的多个文件

(1).定义模板 需要在上传文件的 form 表单上面需要加入enctype="multipart/form-data"

<!-- 相当于给模板定义一个名字, define end 必须成对出现 -->
{{ define "admin/user/addnotfilenameupload.html" }}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>{{.title}}</title>
</head>
<body>
<h2>演示不同文件名的文件上传</h2>
<form action="/admin/user/doNotFileNameUploads" method="post" enctype="multipart/form-data">用户名:<input type="text" name="username" placeholder="用户名"><br/><br/>头像1: <input type="file" name="face1"><br/><br/>头像2: <input type="file" name="face2"><br/><br/><input type="submit" value="提交">
</form>
</body>
</html>
{{ end }}

(2).定义业务逻辑

package routersimport ("gindemo/controllers/admin""gindemo/middlewares""github.com/gin-gonic/gin"
)//添加:不同名字的多文件上传
func (con UserController) AddNotFileNameUpload(c *gin.Context) {c.HTML(http.StatusOK, "admin/user/addnotfilenameupload.html", gin.H{"title": "添加不同名字的多文件上传",})
}//不同文件名的多文件上传
func (con UserController) DoNotFileNameUploads(c *gin.Context) {//获取表单中提交的usernameusername := c.PostForm("username")//获取文件file1, err1 := c.FormFile("face1")file2, err2 := c.FormFile("face2")//判断上传文件上否存在if err1 != nil {//说明上传文件不存在c.JSON(http.StatusInternalServerError, gin.H{"success": "fail","message": err1.Error(),})return}//判断上传文件上否存在if err2 != nil {//说明上传文件不存在c.JSON(http.StatusInternalServerError, gin.H{"success": "fail","message": err2.Error(),})return}//设置需要上传的文件目录 file.Filename 获取文件名; "./static/upload" 是基于main.go文件路由的dst1 := path.Join("./static/upload", file1.Filename)//上传文件到指定目录c.SaveUploadedFile(file1, dst1)//设置需要上传的文件目录 file.Filename 获取文件名; "./static/upload" 是基于main.go文件路由的dst2 := path.Join("./static/upload", file2.Filename)//上传文件到指定目录c.SaveUploadedFile(file2, dst2)c.JSON(http.StatusOK, gin.H{"success": "true","username": username,"dst1": dst1,"dst2": dst2,})
}

(3).增加路由配置

package routersimport ("gindemo/controllers/admin""gindemo/middlewares""github.com/gin-gonic/gin"
)//设置admin后台路由
func AdminRoutersInit(r *gin.Engine) {//路由分组: 配置全局中间件:middlewares.InitMiddlewareadminRouters := r.Group("/admin", middlewares.InitMiddleware){//单文件上传adminRouters.POST("/user/doUpload", admin.UserController{}.DoUpload)  //不同名字的多文件上传adminRouters.GET("/user/addnotfilenameupload",admin.UserController{}.AddNotFileNameUpload)//不同文件名的多文件上传adminRouters.POST("/user/doNotFileNameUploads", admin.UserController{}.DoNotFileNameUploads)}
}

3.多文件上传-相同名字的多个文件

文档:https://gin-gonic.com/zh-cn/docs/examples/upload-file/multiple-file/

(1).定义模板 需要在上传文件的 form 表单上面需要加入 enctype="multipart/form-data"

<!-- 相当于给模板定义一个名字, define end 必须成对出现 -->
{{ define "admin/user/addcommonfilenameupload.html" }}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>{{.title}}</title>
</head>
<body>
<h2>演示相同文件名的文件上传</h2>
<form action="/admin/user/doCommonFileNameUploads" method="post" enctype="multipart/form-data">用户名:<input type="text" name="username" placeholder="用户名"><br/><br/>头像1: <input type="file" name="face[]"><br/><br/>头像2: <input type="file" name="face[]"><br/><br/><input type="submit" value="提交">
</form>
</body>
</html>
{{ end }}

(2).定义业务逻辑

package routersimport ("gindemo/controllers/admin""gindemo/middlewares""github.com/gin-gonic/gin"
)
//添加:相同名字的多文件上传
func (con UserController) AddCommonFileNameUpload(c *gin.Context) {c.HTML(http.StatusOK, "admin/user/addcommonfilenameupload.html", gin.H{"title": "相同名字的多文件上传",})
}//相同文件名的多文件上传
func (con UserController) DoCommonFileNameUploads(c *gin.Context) {//获取表单中提交的usernameusername := c.PostForm("username")//获取formform,_ := c.MultipartForm()//获取多文件files := form.File["face[]"]//遍历文件,并上传for _, file := range files {//设置需要上传的文件目录 file.Filename 获取文件名; "./static/upload" 是基于main.go文件路由的dst := path.Join("./static/upload", file.Filename)//上传文件到指定目录c.SaveUploadedFile(file, dst)}c.JSON(http.StatusOK, gin.H{"success": "true","username": username,"message": "文件上传成功",})
}

(3).增加路由配置

package routersimport ("gindemo/controllers/admin""gindemo/middlewares""github.com/gin-gonic/gin"
)//设置admin后台路由
func AdminRoutersInit(r *gin.Engine) {//路由分组: 配置全局中间件:middlewares.InitMiddlewareadminRouters := r.Group("/admin", middlewares.InitMiddleware){//单文件上传adminRouters.POST("/user/doUpload", admin.UserController{}.DoUpload)  //不同名字的多文件上传adminRouters.GET("/user/addnotfilenameupload",admin.UserController{}.AddNotFileNameUpload)//不同文件名的多文件上传adminRouters.POST("/user/doNotFileNameUploads", admin.UserController{}.DoNotFileNameUploads)//相同名字的多文件上传adminRouters.GET("/user/addcommonfilenameupload",admin.UserController{}.AddCommonFileNameUpload)//相同文件名的多文件上传adminRouters.POST("/user/doCommonFileNameUploads", admin.UserController{}.DoCommonFileNameUploads)      }
}

4.文件上传 按照日期存储

(1).定义模板 需要在上传文件的 form 表单上面需要加入 enctype="multipart/form-data"

<!-- 相当于给模板定义一个名字, define end 必须成对出现 -->
{{ define "admin/user/add-by-date.html" }}
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>{{.title}}</title>
</head>
<body>
<h2>演示文件按日期上传</h2>
<form action="/admin/user/doUploadByDate" method="post" enctype="multipart/form-data">用户名:<input type="text" name="username" placeholder="用户名"><br/><br/>头像: <input type="file" name="face"><br/><br/><input type="submit" value="提交">
</form>
</body>
</html>
{{ end }}

(2).定义业务逻辑

package routersimport ("gindemo/controllers/admin""gindemo/middlewares""github.com/gin-gonic/gin"
)//添加:按日期单文件上传
func (con UserController) AddByDate(c *gin.Context) {c.HTML(http.StatusOK, "admin/user/add-by-date.html", gin.H{"title": "添加:按日期单文件上传",})
}//按日期单文件上传
/**
1.获取上传文件
2.获取后缀名,判断后缀是否正确: .jpg,.png,.gif,.jpeg
3.创建图片保存目录 ./static/upload/20230203
4.生成文件名称和文件保存目录
5.执行上传*/
func (con UserController) DoUploadByDate(c *gin.Context) {//获取表单中提交的usernameusername := c.PostForm("username")//1.获取上传文件file, err := c.FormFile("face")//判断上传文件上否存在if err != nil {//说明上传文件不存在c.JSON(http.StatusInternalServerError, gin.H{"success": "fail","message": err.Error(),})return}//2.获取后缀名,判断后缀是否正确: .jpg,.png,.gif,.jpegextName := path.Ext(file.Filename)//设置后缀mapallowExtMap := map[string]bool {".jpg" : true,".png" : true,".gif" : true,".jpeg" : true,}//判断后缀是否合法if _, ok := allowExtMap[extName]; !ok {c.JSON(http.StatusInternalServerError, gin.H{"success": "fail","message": "上传文件后缀不合法",})return}//3.创建图片保存目录 ./static/upload/20230203//获取日期day := models.GetDay()//拼接目录dir := "./static/upload/" + day//创建目录:MkdirAll 目录不存在,会一次性创建多层err = os.MkdirAll(dir, 0666)if err != nil {c.JSON(http.StatusInternalServerError, gin.H{"success": "fail","message": "创建目录失败",})return}//4.生成文件名称和文件保存目录: models.GetUnix() 获取时间戳(int64); strconv.FormatInt() 把时间戳(int64)转换成字符串filename := strconv.FormatInt(models.GetUnix(), 10) + extName//5.执行上传dst := path.Join(dir, filename)//上传文件到指定目录c.SaveUploadedFile(file, dst)c.JSON(http.StatusOK, gin.H{"success": "true","username": username,"dst": dst,})
}

(3).models/tools.go 添加获取当前时间戳函数

package modelsimport ("crypto/md5""fmt""time"
)//时间戳转换成日期函数
func UnixToTime(timestamp int) string {t := time.Unix(int64(timestamp), 0)return t.Format("2006-01-02 15:04:05")
}//日期转换成时间戳
func DateToUnix(str string) int64 {template := "2006-01-02 15:04:05"t, err := time.ParseInLocation(template, str, time.Local)if err != nil {return 0}return t.Unix()
}//获取当前时间戳
func GetUnix() int64 {return time.Now().Unix()
}//获取当前日期
func GetDate() string  {template := "2006-01-02 15:04:05"return time.Now().Format(template)
}//获取年月日
func GetDay() string {template := "20060102"return time.Now().Format(template)
}func Md5(str string) string {data := []byte(str)return fmt.Sprintf("%x\n", md5.Sum(data))
}

(4).增加路由配置

package routersimport ("gindemo/controllers/admin""gindemo/middlewares""github.com/gin-gonic/gin"
)//设置admin后台路由
func AdminRoutersInit(r *gin.Engine) {//路由分组: 配置全局中间件:middlewares.InitMiddlewareadminRouters := r.Group("/admin", middlewares.InitMiddleware){//单文件上传adminRouters.POST("/user/doUpload", admin.UserController{}.DoUpload)  //不同名字的多文件上传adminRouters.GET("/user/addnotfilenameupload",admin.UserController{}.AddNotFileNameUpload)//不同文件名的多文件上传adminRouters.POST("/user/doNotFileNameUploads", admin.UserController{}.DoNotFileNameUploads)//相同名字的多文件上传adminRouters.GET("/user/addcommonfilenameupload",admin.UserController{}.AddCommonFileNameUpload)//相同文件名的多文件上传adminRouters.POST("/user/doCommonFileNameUploads", admin.UserController{}.DoCommonFileNameUploads)      }//添加:按日期单文件上传adminRouters.GET("/user/addByDate",admin.UserController{}.AddByDate)//添加:按日期单文件上传adminRouters.POST("/user/doUploadByDate", admin.UserController{}.DoUploadByDate)
}

[上一节][golang gin框架] 3.路由详解,自定义控制器,中间件

[下一节]golang gin框架] 5.Cookie以及Session

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

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

相关文章

基于DSP+FPGA的机载雷达伺服控制系统的硬件设计与开发

机载雷达是以飞机为载体的各种雷达天线的总称&#xff0c;主要用于空中侦察、警戒、保 证航行准确与安全[1]。随着航空航天技术的飞速发展&#xff0c;以及微电子、计算机和高速集 成电路等新型技术在军事领域的广泛应用[2]&#xff0c;各国都研制出了许多新型战机和导弹,机 载…

企业微信的聊天机器人来了,免费下载(Python版)

大家好&#xff0c;这里是程序员晚枫&#xff0c;个人网址&#xff1a;python-office.com 上次分享了微信机器人的视频以后&#xff0c;视频下面有一个热门评论&#xff1a; 什么时候开发企业版微信机器人&#xff1f;自动回复、自动群发等等~ 在经历了一段时间的查找和开发以…

【基础算法】之 冒泡排序优化

冒泡排序思想基本思想: 冒泡排序&#xff0c;类似于水中冒泡&#xff0c;较大的数沉下去&#xff0c;较小的数慢慢冒起来&#xff08;假设从小到大&#xff09;&#xff0c;即为较大的数慢慢往后排&#xff0c;较小的数慢慢往前排。直观表达&#xff0c;每一趟遍历&#xff0c;…

Docker----------day3

常规安装大体步骤 1.安装tomcat 1.查找tomcat docker search tomcat2.拉取tomcat docker pull tomcat3.docker images查看是否有拉取到的tomcat 4.使用tomcat镜像创建容器实例(也叫运行镜像) docker run -it -p 8080:8080 tomcat5.新版tomcat把webapps.dist目录换成webapp…

【大数据离线开发】7.4 HBase数据保存和过滤器

7.4 数据保存的过程 注意&#xff1a;数据的存储&#xff0c;都需要注意Region的分裂 HDFS&#xff1a;数据的平衡 ——> 数据的移动&#xff08;拷贝&#xff09;HBase&#xff1a;数据越来越多 ——> Region的分裂 ——> 数据的移动&#xff08;拷贝&#xff09; …

清理bib文件(删除重复项,仅保留tex中引用的条目)

在写latex文件的过程中&#xff0c;经常会遇到添加了一堆文献的bibtex到bib文件中&#xff0c;有时候文章一长同一篇文献用不同的cite-key引用了多次&#xff0c;同时也会有一些文献最后并没被正文引用&#xff0c;这就需要对bib文件进行清理。 删除重复项 可以用JabRef 在J…

经理与员工工资关系-课后程序(JAVA基础案例教程-黑马程序员编著-第四章-课后作业)

【案例4-6】经理与员工工资案例&#xff08;利用多态实现&#xff09; 欢迎点赞关注收藏 【案例介绍】 案例描述 某公司的人员分为员工和经理两种&#xff0c;但经理也属于员工中的一种&#xff0c;公司的人员都有自己的姓名和地址&#xff0c;员工和经理都有自己的工号、工…

不同投票需要的不同上传方式outlook 投票功能怎么设置投票 html5

“艺空间手造坊”网络评选投_投票方式的选择_免费图文教学投票教学关于微信投票&#xff0c;我们现在用的最多的就是小程序投票&#xff0c;今天的网络投票&#xff0c;在这里会教大家如何用“活动星投票”小程序来进行投票。我们现在要以“艺空间手造坊”为主题进行一次投票活…

AcWing1015.摘花生

AcWing 1015. 摘花生Hello Kitty想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图)&#xff0c;从西北角进去&#xff0c;东南角出来。地里每个道路的交叉点上都有种着一株花生苗&#xff0c;上面有若干颗花生&#xff0c;经过一株花生苗就能摘走该它…

Java并发知识点

文章目录1. start()和run()方法的区别&#xff1f;2. volatile关键字的作用&#xff1f;使用volatile能够保证&#xff1a;防止指令重排3. sleep方法和wait方法有什么区别&#xff1f;sleep()方法4. 如何停止一个正在运行的线程&#xff1f;方法一&#xff1a;方法二&#xff1…

多重继承的虚函数表

同一个类,不同对象使用同一张虚函数表 不同类使用不同的虚函数表 子类自己添加的虚函数(非重写),在VS中是将此放在第一个继承类的虚函数表里. #include <iostream> using namespace std;class Father { public:virtual void func1() { cout << "Father::f…

<Linux>vscode搭建Linux远程开发工具

一、下载vscode&#x1f603;可以去vscode的官网下载&#xff0c;不过是外网下载速度较慢提速可以参考&#xff1a;(81条消息) 解决VsCode下载慢问题_vscode下载太慢_wang13679201813的博客-CSDN博客官网&#xff1a;Visual Studio Code - Code Editing. Redefined这里推荐的是…

【数据结构】二叉树的四种遍历

写在前面首先二叉树是一个大家族&#xff0c;这篇文章就讲一讲二叉树的遍历&#xff1a;递归遍历迭代遍历先识概念二叉树的存储结构&#xff0c;可以为顺序存储&#xff0c;即使用数组&#xff1b;也可以为链式存储&#xff0c;即使用链表。我们使用较多的就是链式存储结构&…

Ceres的自动求导实现原理剖析

目录数学原理实现原理总结首先注意数值求导和自动求导在使用的时候的不同之处。 实际上&#xff0c;正是自动求导这个地方使用了类模板&#xff0c;导致它不仅可以传入参数&#xff0c;还可以传入Jet类型的数据&#xff0c;从而实现了参数的雅可比矩阵的计算&#xff0c;完成自…

TPM密钥管理、使用

前面讲过证书相关内容&#xff0c;除了在软件方面有所应用外&#xff0c;在硬件方面也有很多应用。本次讲一下TPM相关的内容。 一、TPM介绍 1.1背景 TCG基于硬件安全的架构是为应对1990s后期日益增多的复杂恶意软件攻击应用而生的。当时以及现在&#xff0c;抵御PC客户端网络…

树状数组(高级数据结构)-蓝桥杯

一、简介树状数组 (Binary Indexed Tree,BIT)&#xff0c;利用数的二进制特征进行检索的一种树状结构。一种真正的高级数据结构&#xff1a; 二分思想、二叉树、位运算、前缀和。高效!代码极其简洁!二、基本应用数列a1,a2,....,an&#xff0c;操作&#xff1a;单点修改&#xf…

详解HashMap

目录 1.hash code 2.数据结构 3.初始化 4.存取 4.1.put 4.2.get 5.迭代 6.扩容 7.JDK1.7版本存在的问题 7.1.性能跌落 7.2.循环链表 8.散列运算 9.扰动函数 1.hash code hash code是使用hash函数运算得到的一个值&#xff0c;是对象的身份证号码&#xff0c;用于…

OpenSumi 是信创开发云的首选

原文作者&#xff1a;行云创新技术总监 邓冰寒 引言 随着云原生应用的日益普及&#xff0c;开发上云也逐步被越来越多的厂商和开发者接受&#xff0c;在这个赛道国内外有不少玩家&#xff0c;国外的 GitHub Codespaces、CodeSandbox&#xff0c;GitPod、亚马逊 Cloud9&#xf…

借力英特尔® Smart Edge,灵雀云 ACP 5G 专网解决方案获得多维度优化加速

近日&#xff0c;灵雀云联合英特尔推出了集成Smart Edge 模块的灵雀云 ACP 5G 专网解决方案&#xff0c;同时共同发布了《借力英特尔 Smart Edge&#xff0c;基于云原生解决方案的灵雀云 ACP 5G 专网版本获得多维度优化加速》白皮书。 得益于云计算技术和 5G 网络的高速发展&am…

Win10 环境 安卓ollvm编译与配置 ndk代码混淆加密

确定你正在使用的ndk版本 查看build.gradle ndkVersion 21.4.7075529 确定你使用的ndk的ollvm版本 C:\Users\Administrator\AppData\Local\Android\Sdk\ndk\21.4.7075529\toolchains\llvm\prebuilt\windows-x86_64\bin\llvm-config.exe --version 9.0.9svn 确定了ollvm版本后…