Go语言
简洁、快速、安全
并行、有趣、开源
内存管理、数组安全、编译迅速
来深圳
在校大学生
展开
-
JWT原理
Java web token(JWT),通过以json形式作为web应用中的令牌,用于在各方之间安全地作为json对象传输。组成部分header头部令牌类型和签名算法,使用Base64编码{ "alg": "HS256", "typ": "JWT"}Payload负载jwt的数据载荷,使用Base64编码{ "exp": 1653580861, "iss": "server-test", "name": "lsz"}Signature签名使用he.原创 2022-05-27 00:18:48 · 169 阅读 · 0 评论 -
Go性能调优
文章目录简介排查实战排查cpu排查堆内存排查协程排查互斥锁排查阻塞简介性能调优原则要依靠数据不是猜测要定位最大瓶颈而不是细枝末节不要过早优化不要过度优化性能分析工具pprofpprof是用于可视化和分析性能 分析数据的工具排查实战引入 _ "net/http/pprof"go func() { if err := http.ListenAndServe(":6060", nil); err != nil { log.Fatal(err) }原创 2022-05-15 22:33:51 · 279 阅读 · 0 评论 -
Go 性能优化
目录评估性能性能优化建议评估性能Benchmarkgo test -bench=. -benchmem性能优化建议slice 预分配内存尽可能在使用make()初始化切片时提供容量信息场景原切片较大,代码在原切片基础上新建小写篇原底层数组在内存中引用,得不到释放建议使用copy替代re-slicemap预分配内存分析:不断向map中添加元素的操作会触发map的扩容提前分配好空间可以减少内存拷贝和rehash的消耗建议根据实际需求提前预估好需要的空间字原创 2022-05-15 22:21:37 · 236 阅读 · 0 评论 -
Golang GC
文章目录GC一些概念追踪垃圾回收分代GC引用计数GCGo的GC演变Go v1.3之前的标记清除Go v1.5三色标记Go v1.8混合写屏障机制GC一些概念Mutator: 业务线程,分配新对象,修改对象指向关系Collector: GC线程,找到存活对象,回收死亡对象的内存空间Serial GC: 只有一个collectorParallel GC: 支持多个collectors同时回收的GC算法Concurrent GC: mutator(s)和collector(s)可以同时执行 Co原创 2022-05-15 00:33:10 · 302 阅读 · 0 评论 -
Golang GMP并发模型(一)
cpu线程切换,涉及到系统调用和上下文切换,进程或线程数量越多,切换的成本就越大,也越浪费cpu利用率越低多进程带来了同步竞争(如锁、竞争资源冲突等),使开发设计越来越复杂高消耗的调度cpu高内存占用, 进程占用内存 虚拟内存4GB(32 bit os),线程占用内存约4MB调度器的设计策略复用线程work stealing机制当从本地线程绑定的P本地队列、全局队列都找不到可执行的G,会从别的P本地队列中偷取G并放入当前P本地队列上执行从全局队列取的G数量:N = min(len(原创 2022-05-12 00:23:44 · 120 阅读 · 0 评论 -
青训营-刷题打卡-控制并发执行goroutine的数量
给定包含 N 个任务 task 的数组 tasks 和整数 K,和一个可并发调用的执行函数 execute,要求实现以下逻辑:execute并发调用次数不超过10以最快速度执行完所有task使用golang实际上就是控制并发执行goroutine的数量,这里给出两种解决方法,使用chan的方法更普遍package mainimport ( "context" "golang.org/x/sync/semaphore" "sync")type Task intfunc h.原创 2022-04-21 11:47:24 · 254 阅读 · 0 评论 -
Golang new和make 的区别
make和new是go的内置函数,不是关键字如果变量是指针类型或者引用类型,系统不会为他分配内存,默认是nilmake 和 new 都是用来申请内存的, 有了内存,变量就可以使用了区别:make函数返回slice, map, chan 类型本身new函数返回一个指向内存地址的指针make只能用来分配和初始化slice, map, chan类型变量new 可以分配任意类型的变量,并置为零值...原创 2022-03-15 19:36:41 · 185 阅读 · 0 评论 -
Go进制转换
res := strconv.FormatInt(4, 2) fmt.Println(res) parseInt, _ := strconv.ParseInt("e", 16, 64) fmt.Println(parseInt)原创 2022-03-11 15:46:55 · 490 阅读 · 0 评论 -
leetcode单词拆分-Golang
139. 单词拆分用set记录wordDict中单词出现情况暴力不过,仔细分析发现其中确实存在重复的判断func wordBreak(s string, wordDict []string) bool { set := make(map[string]bool) for i := 0; i < len(wordDict); i++ { set[wordDict[i]] = true } return help(s, set, 0)}func help(s string, s原创 2022-03-09 20:13:39 · 178 阅读 · 0 评论 -
leetcode环形链表
141. 环形链表解法一: 哈希表func hasCycle(head *ListNode) bool { set := map[*ListNode]bool{} cur := head for cur != nil { if has := set[cur]; has { return true } else { set[cur] = true } cur = cur.Next } retu原创 2022-02-21 12:12:41 · 406 阅读 · 0 评论 -
哈希表hash
构造哈希函数直接地址法、数字分析法、平方取中法、折叠法、除留余数法、随机数法冲突解决开发地址法再哈希法拉链法建立公共溢出区设计哈希集合705. 设计哈希集合type MyHashSet struct { data []list.List}func Constructor() MyHashSet { return MyHashSet{data: make([]list.List, 911)}}func hash(key int) int { return key % 9原创 2022-02-11 23:53:08 · 335 阅读 · 0 评论 -
gin获取用户请求IP
nginx配置作用就是在反向代理的时候,将用户ip设置到请求头中location / { proxy_set_header X-Forward-For $remote_addr; proxy_set_header X-real-ip $remote_addr; proxy_pass http://xxxxxx; }gin的某个版本有bug?c.ClientIP()获取的还是127.0.0.1我们可以用c.Request.Header.Get("X-Forwar原创 2022-02-09 20:41:36 · 7038 阅读 · 0 评论 -
viper读取配置文件
????Github链接???? go get github.com/spf13/viper????基本使用type ServerSettingS struct { RunMode string HttpPort int ReadTimeout int WriteTimeout int}func TestViper(t *testing.T) { vp := viper.New() //创建viper实例 vp.SetConfigNam原创 2021-11-22 17:54:12 · 586 阅读 · 0 评论 -
logrus日志库
日志级别logrus有七种日志级别:Trace, Debug, Info, Warning, Error, Fatal and Paniclog.Trace("Something very low level.")log.Debug("Useful debugging information.")log.Info("Something noteworthy happened!")log.Warn("You should probably take a look at this.")log.Er原创 2021-11-21 22:15:36 · 580 阅读 · 0 评论 -
runtime.Caller
func Caller(skip int) (pc uintptr, file string, line int, ok bool)Caller reports file and line number information about function invocations on the calling goroutine’s stack. The argument skip is the number of stack frames to ascend, with 0 identifying .原创 2021-10-28 11:38:13 · 225 阅读 · 0 评论 -
gin中间件中使用Next()和Abort()
Next()Next should be used only inside middleware.Next应该在中间件中使用It executes the pending handlers in the chain inside the calling handler.在调用的handler 中,执行链路上等待的handlersAbortAbort prevents pending handlers from being called. Note that this will not st原创 2021-10-04 12:05:32 · 678 阅读 · 0 评论 -
使用 gomail 发送邮件
gomail 是一个用于发送电子邮件的简单且高效的第三方开源库, 目前只支持使用SMTP服务发送电子邮件, 但是其API较为灵活, 如果其他定制需求, 则可以轻易地借助其实现.Demoimport ( "crypto/tls" "gopkg.in/gomail.v2" "log")func main() { message := gomail.NewMessage() message.SetHeader("From", "xxxxx@qq.com") message.SetHead原创 2021-10-03 19:37:20 · 1175 阅读 · 0 评论 -
Go 类型断言(Type assertion)
类型断言Golang的类型断言提供对接口(interface)值的底层具体值的访问t := i.(T)该语句断言接口值 i 持有具体类型 T 并将底层 T 值分配给变量 t。如果 i 的具体类型不是 T,则该语句将引发panic。t, ok := i.(T)类型断言可以返回两个值:基础值和报告断言是否成功的布尔值。A Tour of Go...原创 2021-09-20 20:08:07 · 166 阅读 · 0 评论 -
Golang对某一字符串排序
首先,字符串转为[]byte, 对切片排序, 最后切片转字符串str := "eat"b := []byte(str)sort.Slice(b, func(i, j int) bool { return b[i] < b[j]})str = string(b)首先字符串分割,得到字符串切片, 对切片排序, strings.join连接成新的字符串func sortString(str string) string { split := strings.Split(str, .原创 2021-08-11 15:26:28 · 4513 阅读 · 0 评论 -
golang 常量
golang 两种声明常量的方式定类型const pi float64 = 3.141var a float32 = float32(pi)var b float64 = pi未定类型未定类型常量具有弹性, 在可兼容的类型之间转换无需显示转换const a = 1.23var b float64 = avar c float32 = a常量和变量的不同常量用于存储固定不变的值常量声明时必须赋值常量不能重新赋值已声明的常量可以不使用短声明语法不能用来声明常量常量的数据类型只原创 2021-08-07 17:35:53 · 113 阅读 · 0 评论 -
完全二叉树的节点个数
2021年8月5日leetcode 222题给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。入门看到这题, 很容易想到用深搜或广搜求解 ,然而, 同样时间复杂度的递归分治解法更加简单递归实现, 时间和空间复杂度都是O(n)func countNodes(root *TreeNo原创 2021-08-06 10:49:30 · 993 阅读 · 0 评论 -
golang切片为什么不初始化就可以append
append函数是用来在slice末尾追加一个或者多个元素。当追加元素时,发现slice的len>cap时,会重新开辟一个2*cap的内存空间去存储追加过元素的slice。如果追加元素后slice的len<=cap,则append返回的新生成的slice的内存地址依旧是传入的slice参数的内存地址。 var slice []int slice = append(slice, 1, 3, 5) fmt.Println(slice) //[1 3 5]...原创 2021-07-20 14:51:58 · 1096 阅读 · 0 评论 -
翻转单词顺序golang实现
func reverseWords(s string) string { tmp := strings.Fields(strings.Trim(s, " ")) reverse(tmp) join := strings.Join(tmp, " ") return strings.Trim(join, "")}func reverse(s []string) []string { for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 { s[i原创 2021-06-19 22:24:08 · 224 阅读 · 0 评论