Golang
宋song一
这个作者很懒,什么都没留下…
展开
-
go-zero
启动注册(全量获取,增量侦听,应对故障。资源管理器:确保共享资源只有一份。原创 2023-06-15 16:24:32 · 106 阅读 · 0 评论 -
golang一些做法
在使用这些框架或中间件时,需要定义事务的边界和参与者,并将事务的执行过程分为不同的阶段,如预留、确认和取消等。总之,对于Go微服务内存突然飙升的情况,我们需要通过确认是否是正常的内存使用、检查代码逻辑、使用pprof工具和持续监控等步骤进行排查。用于同步:空结构体可以用于同步,例如通过channel传递空结构体信号来触发一些动作,或者使用空结构体作为锁的值,避免浪费内存空间。总之,Golang分布式日志链路追踪需要使用追踪和日志库来收集和传递信息,以及使用分布式追踪系统来管理和分析信息。原创 2023-05-24 05:09:44 · 317 阅读 · 0 评论 -
Go并发编程
go并发控制,锁,GC原创 2022-09-05 01:21:34 · 107 阅读 · 0 评论 -
golang将数组重复元素放在数组后面
使用map. 包含重复元素个数 s := []int{9, 8, 9, 1, 3, 2, 3, 1, 5, 2, 1, 1} time1 := time.Now().UnixNano() s2 := make([]int, 0) m := make(map[int]int) for i, v := range s { if _, ok := m[v]; ok { s2 = append(s2, v) } m[v] = i } //fmt.Println(len(m), m.原创 2022-03-30 14:46:55 · 1026 阅读 · 0 评论 -
golang性能瓶颈
原创 2022-02-22 11:04:45 · 203 阅读 · 0 评论 -
golang recover
func main() { go func() { defer func() { if e := recover(); e != nil { log.Printf("recover: %v", e) } }() panic("煎鱼焦了") }() log.Println("Go 语言编程之旅:一起用 Go 做项目")}recover 要与 defer 联用,并且不跨协程(goroutine),才能够真正的拦截到 panic 事件...原创 2021-07-02 18:35:03 · 233 阅读 · 0 评论 -
golang源码
gmp调度: runtime/proc.gogoroutine初始大小:runtime/stack.go Go: Goroutine 的堆栈大小是如何演进的原创 2021-06-15 10:36:12 · 138 阅读 · 0 评论 -
golang资源
Go 每日一库原创 2021-06-10 17:31:34 · 64 阅读 · 0 评论 -
gorm使用
Gorm 指定表前缀或指定表名db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{ NamingStrategy: schema.NamingStrategy{ TablePrefix: "it_", // 表名前缀,`Article` 的表名应该是 `it_articles` SingularTable: true, // 使用单数表名,启用该选项,此时,`Article` 的表名应该是 `it_article` },原创 2021-05-07 20:54:57 · 829 阅读 · 0 评论 -
golang 规范与交叉编译
1. 规范gofmt ,大部分的格式问题可以通过 gofmt 解决, gofmt 自动格式化代码,保证所有的 go 代码与官方推荐的格式保持一致,于是所有格式有关问题,都以 gofmt 的结果为准。goimports ,此工具在 gofmt 的基础上增加了自动删除和引入包。go vet ,vet 工具可以帮我们静态分析我们的源码存在的各种问题,例如多余的代码,提前 return 的逻辑, struct 的 tag 是否符合标准等。编译前先执行代码静态分析。golint ,类似 javascript原创 2021-03-25 21:47:14 · 94 阅读 · 1 评论 -
Go入门指南(The Way to Go)
1. defer1.使用 defer 语句实现代码追踪func trace(s string) string { fmt.Println("entering:", s) return s}func un(s string) { fmt.Println("leaving:", s)}func a() { defer un(trace("a")) fmt.Println("in a")}2.使用 defer 语句来记录函数的参数与返回值func func1(s string)原创 2021-03-09 17:51:59 · 117 阅读 · 0 评论 -
golang数组题
数组反转func reverseArray(arr []int) []int { length := len(arr) for i := 0; i < length/2; i++ { temp := arr[length-1-i] arr[length-1-i] = arr[i] arr[i] = temp } return arr}删除数组最大值, 不排序func delMax(arr []int) []int { if len(arr) <= 1 {.原创 2021-03-04 19:00:07 · 120 阅读 · 1 评论 -
并发模型 GMP
原创 2021-01-26 18:10:26 · 76 阅读 · 0 评论 -
golang 注意
1. printffmt.Printf("%[1]b %[1]d\n",v) i := []int{5, 6, 7} for _, v := range i { fmt.Printf("%[1]b %[1]d\n",v) }原创 2021-01-25 15:48:47 · 87 阅读 · 0 评论 -
big.Int阶乘
package mainimport ( "fmt" "math/big" "sync" "time")//var myMap = make(map[uint]uint, 10)//var lock sync.Mutexvar synMap sync.Mapfunc test(n *big.Int) { res := big.NewInt(1) for i := big.NewInt(1); i.Cmp(n) == -1; i.Add(i, big.NewInt(1)) {原创 2021-01-19 20:55:46 · 180 阅读 · 0 评论 -
string
1. 查找子串的最长子串,要求子串字符不重复,例如abcda,最长子串为abcdfunc lengthOfLongestSubstring1(s string) string { if s == "" { return "" } li := make([]byte, 1) li[0] = s[0] for i := 1; i < len(s); i++ { for j := 0; j < len(li); j++ { if s[i] == li[j] { li原创 2021-01-12 23:01:38 · 119 阅读 · 0 评论 -
一些面试题
从输入URL到浏览器显示页面发生了什么DNS:原创 2021-01-10 20:27:35 · 158 阅读 · 0 评论 -
golang满二叉树及遍历
判断一棵二叉树是不是满二叉树(树的节点层数h不超过16层)type Node struct { val int left *Node right *Node}//二叉树深度func maxDepth(root *Node) int { if root == nil { return 0 } lhight := maxDepth(root.left) rhight := maxDepth(root.right) return max(lhight, rhight)}fun原创 2021-01-10 15:19:15 · 157 阅读 · 0 评论 -
goroutine
进程是系统进行资源分配和调度的基本单位线程是程序执行的最小单位1. 特点有独立的栈空间共享程序堆空间调度由用户控制协程是轻量级的线程,是逻辑态的2. PMGM:操作系统的主线程P:协程执行需要的上下文...原创 2021-01-09 18:32:12 · 90 阅读 · 0 评论 -
Golang单元测试与性能优化
执行测试命令 go run test [-v],-v打印日志go run test -v -run TestStore : 测试单个方法monster.gopackage jsonimport ( "encoding/json" "fmt" "io/ioutil")type Monster struct { Name string Age int Birthday string Sal float64 Skill string}func原创 2021-01-09 17:19:20 · 1141 阅读 · 0 评论 -
golang 的内存逃逸分析
golang 的内存分配逃逸 于堆和栈查看是否逃逸:go build -gcflags=-m -lgo tool compile --help:查看参数-m: 打印优化决策-l:不让编译时自动内连函数逃逸分析的用处(为了性能)最大的好处应该是减少gc的压力,不逃逸的对象分配在栈上,当函数返回时就回收了资源,不需要gc标记清除。因为逃逸分析完后可以确定哪些变量可以分配在栈上,栈的分配比堆快,性能好同步消除,如果你定义的对象的方法上有同步锁,但在运行时,却只有一个线程在访问,此时逃逸分析后的原创 2021-01-07 10:12:41 · 276 阅读 · 0 评论 -
golang链表
package mainimport "fmt"type ListNode struct { Val int Next *ListNode}//链表实现队列func InsertNode(head *ListNode, newNode *ListNode) { temp := head for { if temp.Next == nil { //表示找到最后 break } temp = temp.Next //让temp不断指向下一个节点 } temp.N原创 2020-12-13 19:26:40 · 115 阅读 · 0 评论 -
Gin使用
1. 获取post请求数据tag标记为form时,json和form请求字段均小写tag标记为json时,json请求小写,form请求首字母大写1. 获取post请求form表单提交的数据type user struct { Username string `form:"username"` Password string `form:"password"`}func main() { r := gin.Default() r.POST("hello", func(c *gin.Co原创 2020-12-02 22:52:31 · 623 阅读 · 0 评论 -
golang tcp
一、服务端package mainimport ( "fmt" "net" "time")func main() { TCPListener, err := net.Listen("tcp", ":8004") //tcpAddr, err := net.ResolveTCPAddr("tcp", ":8004") //if err!=nil{ // fmt.Println("ResolveTCPAddr err:",err) //} // //TCPListener, e原创 2020-10-17 16:49:33 · 269 阅读 · 0 评论 -
golang udp
netcat 可以模拟网络请求(nc命令)一、服务端package mainimport ( "fmt" "net" "time")func main() { udpAddr, err := net.ResolveUDPAddr("udp", "127.0.0.1:8003") if err!=nil{ fmt.Println("ResolveUDPAddr err:",err) return } fmt.Println("udp创建成功",udpAddr) udp原创 2020-10-17 13:46:46 · 325 阅读 · 0 评论 -
golang获取eth最新区块
一、使用geth方法package mainimport ( "context" "fmt" "log" "math/big" "github.com/ethereum/go-ethereum/ethclient")func main() { client, err := ethclient.Dial("https://mainnet.infura.io") if err != nil { log.Fatal(err)原创 2020-08-21 17:28:13 · 1135 阅读 · 0 评论 -
mysql - golang
一、CRUDpackage mainimport ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql")func main() { db, err := sql.Open("mysql", "root:mysql3306@tcp(localhost:3306)/test") db.Ping() if err != nil { fmt.Println("连接失败") return } defer func() {原创 2020-08-11 21:03:52 · 97 阅读 · 0 评论 -
常用gc算法
golang使用三色标记法,java使用分代收集法在runtime包下的mgc.go定义原创 2020-08-02 23:32:41 · 115 阅读 · 0 评论 -
golang:map 的底层实现原理是什么
源自go map底层一、什么是 map维基百科里这样定义 map:In computer science, an associative array, map, symbol table, or dictionary is an abstract data type composed of a collection of (key, value) pairs, such that each possible key appears at most once in the collection.简单说原创 2020-07-30 17:08:07 · 2282 阅读 · 5 评论 -
golang--基本数据类型,big.Int类型,类型转换
nil 是 interface、function、pointer、map、slice 和 channel 类型变量的默认初始值不可以用"=="比较类型: slice(切片)、map(key-value集合)、func(函数)map的比较可以使用reflect.DeepEqual()m1 := map[string]string{"one": "a", "two": "b"}m2 := map[string]string{"two": "b", "one": "a"}// 1.map类型原创 2020-07-30 15:03:18 · 9452 阅读 · 0 评论 -
golang反射reflect
作用:获取结构体属性的值,设置结构体属性的值,获取tag标记设置时,结构体属性首字母必须大写。type People struct { Age int `json:"age"` Name string}func main(){//设置结构体属性的值 p := new(People) content := "Name" v := reflect.ValueOf(p).Elem() //属性是否可以被设置 fmt.Println(v.FieldByName(content).CanSe原创 2020-07-27 22:06:19 · 142 阅读 · 0 评论 -
golang项目管理
使用 Go 模块创建项目(vgo)go mod wikiproxy.golang.org - Official project - Run by Google - The default Go module proxy built by the Go team.gocenter.io - Free community project - Run by JFrog Artifactory - The central Go modules re原创 2020-07-23 13:58:58 · 345 阅读 · 0 评论 -
golang随机数
Go中使用seed得到相同随机数的问题一、随机数种类伪随机生成的数字是确定的,不论在什么机器、什么时间,只要执行的随机代码一样,那么生成的随机数就一样根据密码学原理,要想对一个“随机数”进行随机性检验有以下几个标准:统计学伪随机性 - 在给定的随机比特流样本中,1 的数量大致等于 0 的数量,也就是说,“10”“01”“00”“11” 四者数量大致相等。说人话就是:“一眼看上去是随机的”。密码学安全伪随机性 - 就是给定随机样本的一部分和随机算法,不能有效的演算出随机样本的剩余部分。真随机性原创 2020-07-21 22:31:32 · 1939 阅读 · 0 评论 -
golang排序算法
一、冒泡排序rand.Seed(time.Now().UnixNano())var a [10]intn := len(a)for i := 0; i < n; i++ { a[i] = rand.Intn(100) fmt.Println(a[i])}for i := 0; i < n-1; i++ { for j := 0; j < n-1-i; j++ { if a[j] > a[j+1] { //从小到大。从大到小用< a[j], a[j原创 2020-07-01 22:49:21 · 127 阅读 · 0 评论 -
go语言常用
一、Go语言中的数据类型转换在go语言中,不同类型的变量之间赋值需要显示转换。语法:T t=T(e)var i int=1//将i转换为float类型var j float32=float32(i)基本数据类型转string方法1:fmt.Sprintf("%参数",表达式)func Sprintf(forat string,a …interface{}) stringSprintf根据format参数生成格式化的字符串并返回该字符串var num int =1var str str原创 2020-06-20 18:22:49 · 393 阅读 · 2 评论