Golang
文章平均质量分 52
sandyznb
这个作者很懒,什么都没留下…
展开
-
pear admin 运行报错
从pear admin 下载了golang版本的代码,按照要求都配置好了,mac下就是跑不起来,第一感觉是库里边的代码有问题,但是我又没有找到问题,后来我又在ubuntu上down了代码,ubuntu上可以跑起来,这时我才知道应该是mac的golang环境的问题。192:pear-admin-go sandy$ go run main.go {"level":"info","time":"2022-05-14 10:20:45.485","caller":"/Volumes/macHDD/go_pa原创 2022-05-14 11:01:26 · 818 阅读 · 0 评论 -
layuimini 笔记
不熟悉web开发,步步艰难!!!一:登录相关login.html原本内容<script> layui.use(['form'], function () { var form = layui.form, layer = layui.layer; // 登录过期的时候,跳出ifram框架 if (top.location != self.location) top.location = self.loc原创 2022-05-12 17:38:51 · 2694 阅读 · 0 评论 -
kcp-go 源码分析(一)
项目中用的是"github.com/xtaci/kcp-go",这个仓库不仅仅实现了kcp算法,而且在kcp算法层面上又包装了一层,比如说提供了多种数据加密方式和FEC前向纠错,用起来非常方便。这一篇先分析kcp-go库对kcp算法包装这部分,先分析怎么用,怎么用都不知道去谈算法个人觉得没有意义,kcp算法层面的东西后面再分析。1:先分析服务器层面的func Listen(laddr string) (net.Listener, error) { return ...原创 2022-04-13 16:34:24 · 2259 阅读 · 0 评论 -
golang中的Mutex和RWMutex
Mutex互斥锁,对共享资源进行访问控制的主要手段,使用起来很方便,就Lock和Unlock(),使用简单不代表内部实现就简单,我们可以深入思考一下如果对Mutex重复解锁会出现什么情况?为什么会出现?一:Mutex数据结构src\sync\mutex.go// A Mutex must not be copied after first use.type Mutex struct { state int32 sema uint32}// A Locker represents原创 2022-02-14 18:35:20 · 696 阅读 · 0 评论 -
golang struct里面嵌入interface
最近在看context底层源码时发现了一个奇怪的用法:struct里边嵌入interface,struct又没有实现interface的所有接口直接上源码吧:src\context\context.gotype Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key interface{}) interface{}}typ原创 2022-02-14 17:24:30 · 1338 阅读 · 0 评论 -
Golang “可比较” 总结
常见的有 bool、数值型、字符、指针、数组等,这些是可比较的。。像切片、map、函数等是不能比较的结构体比较:1:结构体只能比较是否相等,但是不能比较大小2:相同类型的结构体才能够进行比较,结构体是否相同不但与属性类型有关,还与属性顺序相关3:如果 struct 的所有成员都可以比较,则该 struct 就可以通过 == 或 != 进行比较是否相等,比较时逐个项进行比较,如果每一项都相等,则两个结构体才相等,否则不相等;看例子: sn1 := struct {原创 2021-07-27 16:01:00 · 744 阅读 · 0 评论 -
LRU算法 缓存淘汰算法
LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。新数据插入到链表头部; 每当缓存命中(即缓存数据被访问),则将数据移到链表头部; 当链表满的时候,将链表尾部的数据丢弃。最开始时,内存空间是空的,因此依次进入A、B、C是没有问题的 当加入D时,就出现了问题,内存空间不够了,因此根据LRU算法,内存空间中A待的时间最为久远,选择A,将其淘汰 当再次引用B时,内存..原创 2021-07-16 16:03:14 · 164 阅读 · 1 评论 -
Golang 单链表反转
type NodeX struct { value int next *NodeX}func createNodeList() *NodeX { var head *NodeX for i := 0; i < 5; i++ { tmp := &NodeX{ value: i, next: nil, } tmp.next = head //头插 head = tmp } return head}func reverseNodeList(h.原创 2021-07-13 17:20:53 · 205 阅读 · 0 评论 -
Golang defer、panic和recover
可恢复的 panic 必须要 recover 的配合,并且这个 recover 必须位于同一 goroutine 的直接调用链上,否则无法对 panic 进行恢复。当一个 panic 被恢复后,调度并因此中断,会重新进入调度循环,进而继续执行 recover 后面的代码, 包括比 recover 更早的 defer(因为已经执行过得 defer 已经被释放, 而尚未执行的 defer 仍在 goroutine 的 defer 链表中),或者 recover 所在函数的调用方。例子1:fun原创 2021-07-13 12:05:33 · 342 阅读 · 0 评论 -
Golang switch
switch是一个条件语句,可以认为switch是多个if else 子句的替代方式func demo1(){ n := 1 switch n{ case 1: xxxxx case 2: xxxxxx }}func demo2(){ switch n := 7; n{ case 1, 3, 5, 7, 9: fmt.Println("奇数") case 2, 4, 6, 8: fm.原创 2021-07-13 11:04:20 · 83 阅读 · 0 评论 -
技术blog、git 记录
Go 语言原本 under-the-hood 欧长坤https://golang.design/under-the-hood/Go 语言设计与实现 https://draveness.me/golang/原创 2021-07-13 10:07:03 · 92 阅读 · 0 评论 -
golang 字符串拼接
Go 语言中,字符串是只读的,也就意味着每次修改操作都会创建一个新的字符串。如果需要拼接多次,应使用strings.Builder,最小化内存拷贝次数。var str strings.Builderfor i := 0; i < 1000; i++ { str.WriteString("a")}fmt.Println(str.String())...原创 2021-07-12 18:37:32 · 95 阅读 · 0 评论 -
Golang中 struct和interface 嵌套组合
阅读pitaya的代码中 发现代码中有相当多的struct 组合 interface上边日子中就是 TCPAcceptor 这个struct中组合了一个net.Listener 类型的listener 而net.Listener是一个接口类型tcpPlayerConn 这个struct里边组合了一个 interface类型的ConnTcpAcceptor 类型的对象a,a.listener.Accept(),因为不是匿名的,所以要用a.listenter.xxxxxt...原创 2021-07-09 18:33:38 · 1795 阅读 · 0 评论 -
Golang 中type name 和 type struct区别
golang中type 关键字大致有如下功能1:定义结构,接口type TestStruct struct{ //XXXXXX}type TestInterface interface{ //XXXXXXXXXX}2:以现有类型定义一个新的类型type MyInt int3:定义别名,仅仅是个别名 aliastype MyInt=inttype NameMap = map[string]interface{}4:定义函数类型type cb原创 2021-07-09 17:41:20 · 1483 阅读 · 0 评论 -
Golang 组合和转发
先来看看组合的示例代码:package mainimport ( "fmt")type Base struct { // nothing}func (b *Base) ShowA() { fmt.Println("showA") b.ShowB()}func (b *Base) ShowB() { fmt.Println("showB")}type Derived struct { Base}func (d *Derived) ShowB() { fmt.原创 2021-07-09 17:28:22 · 254 阅读 · 0 评论 -
Golang 用组合实现继承
golang中没有继承的概念,但是可以使用组合来实现类似c++等高级的继承#include <iostream>using namespace std;class Person {public: void Say();};void Person::Say() { cout << "I'm a person." << endl;}// 继承class Student : public Person {};int main()原创 2021-07-09 17:13:58 · 667 阅读 · 0 评论 -
ubuntu etcd部署
默认是localhost:2379 127.0.0.1:2379#前台启动./etcd --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://0.0.0.0:2379 --listen-peer-urls http://0.0.0.0:2380#后台启动nohup./etcd--listen-client-urlshttp://0.0.0.0:2379--advertise-client...原创 2021-07-07 18:54:03 · 361 阅读 · 0 评论 -
Golang 字符串以及数组、切片、字符串关系
这段话z原创 2021-06-16 18:29:23 · 400 阅读 · 0 评论 -
Golang 中new和make的区别
new和make 都是用来内存分配的。。对于引用类型的变量,我们在使用的时候不仅要声明它,还要为它分配内存空间,否则我们的值就没办法存原创 2021-06-16 18:22:05 · 48 阅读 · 0 评论 -
golang 引用类型和值类型
go语言中函数传参数永远是值传递引用类型:原创 2021-06-16 18:13:07 · 123 阅读 · 0 评论 -
Golang 列表list
列表有很多种实现方法,比如单链表、双链表等golang中 列表container/list 内部的实现原理是双链表原创 2021-06-09 18:44:46 · 5892 阅读 · 0 评论 -
Golang 接口和nil
type I interface { A() B() C()}type Test struct { name string}func (t Test)A(){ fmt.Println("A()")}func (t *Test)B(){ fmt.Println("B()")}func (t *Test)C(){ fmt.Println("C()",t.name)}func main() { var t *Test = nil var i I = t //i.A.原创 2021-06-07 15:41:59 · 163 阅读 · 0 评论 -
Golang 值接收者和指针接收者
package mainimport "fmt"type PersonA struct { name string}func (p *PersonA) Speak(){ fmt.Println("person speak")}func (p PersonA) Walk(){ fmt.Println("person walk")}func main(){ pa := PersonA{name:"sandy"} pb := &PersonA{"mandy"} pa.原创 2021-06-07 15:03:12 · 333 阅读 · 1 评论 -
Golang runtime.GOMAXPROCS(1)
golang中文网上有一些面试https://studygolang.com/articles/11003 第三题参考答案是:“打印的顺序是随机的。 但是A:均为输出10,B:从0~9输出(顺序不定)。”A的输出是10,B是0-9,这个是变量的作用域不同引起的,这个很好理解。但是输出顺序是不是随机的呢?我们稍加改动如下 加入日志。。。。func main() { runtime.GOMAXPROCS(1) count := 10 wg := sync.WaitGroup{} wg..原创 2021-05-18 13:48:40 · 604 阅读 · 0 评论 -
Golang 协程调度器
GPM介绍:G:goroutine协程M:thread线程P:processor处理器废弃的调度器M访问、放回G都必须访问全局G队列,M还有多个即多线程访问同一资源需要加锁进行保证互斥/同步,所以全局G队列是有互斥锁进行保护的老的调度器是有以下缺点的:1:创建、销毁、调度G时,都需要每个M获得锁,形成了激烈的锁竞争。2:M转移G会造成延迟和额外的系统负载,例如当前的G创建了新的协程G’,这个G’加入到队列中可能被其他M执行了,因为G和G’是相关的,最好放在同一个M上执行。原创 2021-05-13 21:14:41 · 201 阅读 · 1 评论 -
Golang slice扩容深度分析
slice 扩容策略大多数文章介绍 slice扩容的时候 就是按照下边这段代码说写的这样。。func growslice(et *_type, old slice, cap int) slice { ....... newcap := old.cap doublecap := newcap + newcap if cap > doublecap { newcap = cap } else { if old.len < 1024 { newcap =原创 2021-04-28 19:35:37 · 225 阅读 · 1 评论 -
Golang slice
1:底层数据结构type Slice struct { Elem *Type // element type}cmd/compile/internal/types.NewSlicefunc NewSlice(elem *Type) *Type { if t := elem.Cache.slice; t != nil { if t.Elem() != elem { Fatalf("elem mismatch") } return t } t := New(T...原创 2021-04-28 11:06:32 · 166 阅读 · 0 评论 -
Golang 数组
1:从两个维度描述数组 数组中存储的元素类型和数组最大能存储的元素个数cmd/compile/internal/types.Array// Array contains Type fields specific to array types.type Array struct { Elem *Type // element type Bound int64 // number of elements; <0 if unknown yet}Go 语言数组在初始化之后...原创 2021-04-27 16:35:42 · 578 阅读 · 0 评论 -
golang map + range
map遍历for i := 0;i<10;i++{ data := map[string]string{"1": "A", "2": "B", "3": "C"} for k, v := range data { fmt.Printf("k=%s v=%s\n",k,v) data[v] = k //fmt.Printf("res %v\n", data) } fmt.Printf("res##################### %v\n", data)原创 2021-04-13 16:58:50 · 1247 阅读 · 1 评论 -
Golang channel
https://draveness.me/golang/docs/part2-foundation/ch05-keyword/golang-select/原创 2021-04-10 15:25:17 · 152 阅读 · 0 评论 -
Golang map分析
map实际使用的结构体hmap一:扩容策略1:map中的键值对数量 > 8 并且 键值对数量/桶数 > 6.5时,会引发翻倍扩容 overLoadFactor如果B为0 桶的个数为1个键值对数量为7 7也是大于 6.5的 这个时候没有必要扩容,所以 count > bucketCnt 把这种情况排除了2:使用了太多的溢出桶(溢出桶太多,会导致map处理速度降低) tooManyOverflowBucketsa:B ...原创 2021-04-09 18:14:22 · 282 阅读 · 0 评论 -
golang 日志模块
package mainimport ( "net/http" "github.com/natefinch/lumberjack" "go.uber.org/zap" "go.uber.org/zap/zapcore")var sugarLogger *zap.SugaredLoggerfunc main() { InitLogger() defer sugarLogger.Sync() for i := 0;i<100000;i++{ sugarLogger.Inf.原创 2021-03-23 14:35:28 · 182 阅读 · 0 评论