avatar
文章
179
标签
47
分类
46

首页
文章
  • 归档
  • 标签
  • 分类
  • ToDo
  • 友情链接
留言板
关于
Echin の 博客
搜索
首页
文章
  • 归档
  • 标签
  • 分类
  • ToDo
  • 友情链接
留言板
关于

Echin の 博客

Cors
发表于2024-05-07|更新于2024-05-07|Gin|Gin
跨源资源共享(CORS) - HTTP | MDN (mozilla.org) 个人感觉跨域看这个就行了 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061package corimport ( "github.com/gin-gonic/gin" "net/http")func Cors() gin.HandlerFunc { return func(c *gin.Context) { method := c.Request.Method origin := c.Request.Header.Get("Origin") c.Header("Access-Control-Allow-Origin", origin) c.Header("Access-Control-Allow-Headers&qu ...
定制化Zap
发表于2024-05-07|更新于2024-05-07|Gin|Gin
引言我现在好困呐,明明现在才十二点半,困死了 之前一直想着别人写的日志怎么这么高大上,自己写的怎么四五行就结束了——定制化 在小项目中其实自己随便用用就够了,但是项目规模一大,就需要吧日志也定制一下,毕竟定制版肯定比简陋版要快乐一点 定制化 go get -u go.uber.org/zap 设置 配置设置 代码设置 代码将从这两方面进行定制,配置设置中的定制指的是某些输出,显示的定制,而代码设置这是日志的结构之类的设置,因此我们需要两个文件(如何读入配置这里不再赘述) config.go zap.go 思路下面将从定制的代码逻辑开始讲解,其实相比于模块化的代码呈现和逻辑性的代码梳理,其实前者更容易被观摩,后者更容易理清楚思路 Config本来觉得先从core开始会比较好,现在感觉还是从config开始比较好 1234567891011type Zap struct { Prefix string `default:"gin-vue-admin" yaml:"prefix" json:"pref ...
动态规划
发表于2024-05-06|更新于2024-12-02|代码随想录|代码随想录
动态规划# 动态规划,简称DP,是解决很多重叠子问题的有效方法,每一个状态是由上一个状态推导出来的 动态规划我们一般需要从几方面去思考: 状态转换 构造子问题 动态规划与贪心算法 动规是由前一个状态推导出来的,而贪心是局部直接选最优的 思路 确定dp数组(dp table)以及下标的含义 确定递推公式 dp数组如何初始化 确定遍历顺序 举例推导dp数组 斐波那契数列#1 1 2 3 5…….. 递归 123456func fib(n int) int { if n <= 1 { return n } return fib(n-1) + fib(n-2)} 遍历 12345678910111213141516171819func fib(n int) int { if n == 0 || n == 1{ return n } //时间O(n) 空间O(1) pre2 := 0 pre1 := 1 curr ...
基本的io接口
发表于2024-05-02|更新于2024-05-02|Go|Go
这里系统介绍一下基本的IO接口,平常在看项目的时候会发现很多 Reader ,ReadAt,Write,WriteAt 类型,因此这次来系统学习,归纳一下 Reader + Write==Reader== 12345678/* Reader is the interface that wraps the basic Read method.Read reads up to len(p) bytes into p. It returns the number of bytes read (0 <= n <= len(p)) and any error encountered. Even if Read returns n < len(p), it may use all of p as scratch space during the call. If some data is available but not len(p) bytes, Read conventionally returns what is availab ...
bytes
发表于2024-05-01|更新于2024-05-02|Go|Go
bytes库学习 其实我一直觉得Bytes和strings没啥区别,好吧,所以来看一看 Reader类型bytes 包下的 Reader 类型实现了 io 包下的 Reader, ReaderAt, RuneReader, RuneScanner, ByteReader, ByteScanner, ReadSeeker, Seeker, WriterTo 等多个接口。主要用于 Read 数据。 a Reader is read-only and supports seeking The zero value for Reader operates like a Reader of an empty slice. 所以不妨把他理解成一个储物间,要往里面放东西,找东西 12345type Reader struct { s []byte i int64 // 当前读取下标 prevRune int // 前一个字符的下标,也可能 < 0} 初始化签名 1func NewReader(b []byte) *Read ...
sql与redis测试
发表于2024-05-01|更新于2024-05-01|Go|Go
Sqlmock sqlmock是一个实现 数据库测试的Mock库,它不需要建立真正的数据库就可以测试CRUD一些操作,很方便 go get github.com/DATA-DOG/go-sqlmock 案例1234567891011121314151617181920212223242526272829303132333435363738394041424344454647package mainimport "database/sql"// recordStats 记录用户浏览产品信息func recordStats(db *sql.DB, userID, productID int64) (err error) { // 开启事务 // 操作views和product_viewers两张表 tx, err := db.Begin() if err != nil { return } defer func() { switch err { case nil: err = tx.Co ...
单元测试
发表于2024-04-30|更新于2024-05-01|Go|Go
单元测试 Golang的测试依赖于 ==go test== 命令,测试文件一般来说以 ==xxx_test.go== 格式,其中的代码不会被go build编译到最终的可执行文件中 ==xxx_test.go== 文件中有三种类型的函数 类型 格式 作用 测试函数 函数名前缀为Test 测试程序的一些逻辑i行为是否正确 基准函数 函数名前缀为Benchmark 测试函数的性能 示例函数 函数名前缀为Example 为文档提供示例文档 单元测试函数一般来说来goland中创建一个文件名字格式为 x_test.go ,编译器就会自动把他变成测试函数的类型,如果你的函数名字格式写成 TestFunction 开头,自动会生成相应的形式,非常方便 123func TestName(t *testing.T){ //......} 其中 t 用于报告测试失败和附加的日志信息 123func (c *T) Error(args ... ...
strings库
发表于2024-04-29|更新于2024-05-01|Go|Go
普通操作1234567func main() { a := "aaaaaaaa" b := "bbbb" fmt.Println(strings.Compare(a, b)) // 比较,相等为0,不等为-1 fmt.Println(strings.Count(a, "a")) // a 中"a"字符有几个} 12345# output:-1truetrue8 大小写12strings.ToUpper("hhhhhhhh")strings.ToLower("HHHHHHHH") 是否包含某个字符12fmt.Println(strings.Contains(a, "a")) // 是否包含某个字符或者字符串fmt.Println(strings.ContainsAny(a, "b & a")) // 任意一个字符存在true 分割字符串1234567891011fun ...
发送email
发表于2024-04-28|更新于2024-04-28|Gin|Gin
之前不知道怎么发邮件的功能,记录一下 总体的功能实现是:要改密码,绑定/解绑邮箱的时候,我们就会给邮箱发信息确认。 1go get gopkg.in/mail.v2 ==config.go== 12345email: address: xxxxxxx smtpHost: smtp.qq.com smtpEmail: xxxx@qq.com smtpPass: xxxxx ==email.go== 发送的实现其实并不是服务器内部决定的,而是通过QQ邮箱,相当于是将QQ邮箱当作代理,让QQ邮箱来帮我们发送邮件。 那么想要让QQ邮箱为我们发送代理,我们就需要QQ邮箱的权限,因此我们要想取开通一下权限 设置我们发送的邮箱类型(还可以选择其他邮箱)smtpHost 去网页里面开启权限,获得smtpPass,这个相当于权限的钥匙 我们要确认发送方的地址 SmtpEmailFrom 我们还要确认发送方的 姓名 subject 我们还需要设置一下给谁发邮箱,一般来说这个谁 需要 用户自己输入或者数 ...
贪心算法
发表于2024-04-27|更新于2024-05-05|代码随想录|代码随想录
贪心算法 理论基础局部最优推出全局最优,并且想不出反例 想不出反例就是随便想一下好了,不用严格证明 两个极端 贪心算法题目太简单(基于常识) 贪心算法题目太难(忽略尝试的地方) 套路: 无套路 策略: 举反例 贪心就是做过了所以知道了(看教课书上讲解贪心可以是一堆公式,估计大家连看都不想看,所以数学证明就不在我要讲解的范围内了,所以贪心不需要证明) 面试中基本不会让面试者现场证明贪心的合理性,代码写出来跑过测试用例即可,或者自己能自圆其说理由就行了。 总结: 贪心算法就是刷,没有套路,局部最优 分发饼干假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。 对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。 思路:没啥想说的 代码: 123456789101112131415func findContent ...
1…789…18
avatar
Echin-h
keep learning
文章
179
标签
47
分类
46
Follow Me
公告
love is accumulated, not love, too.
最新文章
北京租房2025-07-21
Linux命令补充2025-02-27
非唯一索引加锁规则实操2025-02-19
sls日志接入2025-01-18
操作系统概论2024-12-08
分类
  • CD/CI1
  • CI/CD1
  • Gin10
  • Go26
  • Gorm9
  • JAVA2
  • Linux4
  • MQ1
标签
flamgo CI/CD 简历 代码随想录 ngrok casbin 分布式锁 配置文件 Go 八股文 CD/CI JAVA语法 oauth Gin git vim rpc none NX青训营 flamego 设计模式 Linux docker JWT pinnacle 我爱记单词 sls 计算机网络 博客 Mysql MQ 前端 北京北京 随笔 Gorm 设计原则 k8s 算法 Session 图解HTTP
归档
  • 七月 20251
  • 二月 20252
  • 一月 20251
  • 十二月 20243
  • 十一月 20243
  • 十月 20248
  • 九月 20249
  • 八月 20246
网站资讯
文章数目 :
179
已运行时间 :
本站访客数 :
本站总访问量 :
最后更新时间 :
©2023 - 2025 By Echin-h
框架 Hexo|主题 Butterfly
today is a beautiful day
搜索