Giter Club home page Giter Club logo

go-daily-lib's People

Contributors

aveyuan avatar darjun avatar dependabot[bot] avatar l6l6ng avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

go-daily-lib's Issues

关于cron中的chan

关于cron中的以下代码:

func SkipIfStillRunning(logger Logger) JobWrapper {
  return func(j Job) Job {
    var ch = make(chan struct{}, 1)
    ch <- struct{}{}
    return FuncJob(func() {
      select {
      case v := <-ch:
        j.Run()
        ch <- v
      default:
        logger.Info("skip")
      }
    })
  }
}

其中: ch <- struct{}{} struct初始化不是应该是ch <- struct{}吗,为什么是ch <- struct{}{}

gojsonq 翻页查询偏移量问题

你好,我在使用 gojsonq 的时候发现没有偏移量 Offset 这个方法了。
部分代码如下,没有 Offset 方法,请问你用的是那个版本的 gojsonq

r1 := gq.From("items").Select("id", "name").Limit(3).Get()

公众号文章纠错

今天碰巧看到你写的介绍 ants公众号文章,写的不错。

不过,文章结尾的 ants Github 链接错写成了 github.com/valyala/ants,正确的地址应该是 github.com/panjf2000/ants,因为你的公众号没有评论功能,所以到这里来反馈一下。

共享内存

大佬又是我哈哈哈!
想请教大佬一个问题,就是 golang 中使用共享内存的库有什么推荐的吗?
在网上没有找到合适的库,最好是shm+mmap都有的那种

命令行解析库

地址

https://github.com/guonaihong/clop

子命令demo

package main

import (
	"fmt"
	"github.com/guonaihong/clop"
)

type add struct {
	All      bool     `clop:"-A; --all" usage:"add changes from all tracked and untracked files"`
	Force    bool     `clop:"-f; --force" usage:"allow adding otherwise ignored files"`
	Pathspec []string `clop:"args=pathspec"`
}

type mv struct {
	Force bool `clop:"-f; --force" usage:"allow adding otherwise ignored files"`
}

type git struct {
	Add add `clop:"subcommand=add" usage:"Add file contents to the index"`
	Mv  mv  `clop:"subcommand=mv" usage:"Move or rename a file, a directory, or a symlink"`
}

func main() {
	g := git{}
	clop.Bind(&g)
	fmt.Printf("git:%#v\n", g)
	fmt.Printf("git:set mv(%t) or set add(%t)\n", clop.IsSetSubcommand("mv"), clop.IsSetSubcommand("add"))
}
// run:
// ./git add -f

// output:
// git:main.git{Add:main.add{All:false, Force:true, Pathspec:[]string(nil)}, Mv:main.mv{Force:false}}
// git:set mv(false) or set add(true)

giorgisio / goav

Golang bindings for FFmpeg

博主会不会写一下这个库,我看中文资料很少

go-charts: golang的图表库

go-charts简单方便的形式生成数据图表,支持svgpng两种方式的输出,支持主题light, dark, grafana以及ant

Apache ECharts在前端开发中得到众多开发者的认可,因此go-charts提供了兼容Apache ECharts的配置参数,简单快捷的生成相似的图表(svgpng),方便插入至Email或分享使用。下面为常用的图表截图(主题为light与grafana):

Apache ECharts在前端开发中得到众多开发者的认可,因此go-charts提供了兼容Apache ECharts的配置参数,简单快捷的生成相似的图表(svg或png),方便插入至Email或分享使用

casbin库中,RBAC domain部分的模型文件有误

  • casbin库中,RBAC domain部分的模型文件如下
[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.obj
  • 需要修改为
[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act

每日一库推荐-arpc

一个简单易用、高性能、支持更多姿势的RPC库

网络交互的几种模式

交互方式 方向 完整流程
call c -> s
s -> c
request and response
notify c -> s
s -> c
request without response

传统RPC的缺点

  1. call 只支持 c->s,不支持 s->c,不支持notify
  2. 函数调用的写法,函数返回即结束调用,不支持函数体外的同步/异步回包
  3. 多数rpc框架绑定了序列化

ARPC特点

  1. 支持c/s双向call、notify
  2. 像使用http router一样,不采用函数调用的写法,不依赖反射
  3. 提供类似gin的ctx.Bind方法,方便string、[]byte、struct等类型绑定
  4. 支持异步回包,handler函数返回不代表call处理结束,可以handler返回后再回包(同步异步皆可)
  5. 支持自定制序列化反序列化(pb,msgpack各种,只要你喜欢,随意扩展),为了减少依赖目前默认用的标准库json
  6. 支持自定制协议(tcp,unixsock,kcp,quic...)
  7. 支持应用层定制logger
  8. 支持自定制新连接、连接断开、发送队列满的handler
  9. 支持contex,也支持直接使用timeout参数、非多步流程的调用等待写起来更方便
  10. 支持client pool,因为支持异步并发调用回包,pool实现采用简单的轮询,能够满足性能需要
  11. 支持用户自己定制rpc协议
  12. 支持中间件
  13. 支持发布订阅
  • 最少依赖,默认使用方式只依赖标准库
  • 示例请参考READMEexamples
  • 更多特点请阅读代码,如需扩展,欢迎PR

ARPC性能

  • 简单的echo压测
rpc 协议/网络 序列化 配置 连接数 每个连接并发协程数 qps
arpc tcp/localhost encoding/json os: VMWare Ubuntu 18.04
cpu: AMD 3500U 4c8t
mem: 2G
8 10 8-10万
grpc http2/localhost protobuf os: VMWare Ubuntu 18.04
cpu: AMD 3500U 4c8t
mem: 2G
8 10 2-3万
  • arpc性能基本与当前其他第一梯队性能的golang rpc处于同样水平范围、甚至更高
  • grpc由于使用了http2,性能浪费是不可避免的,这里对比qps只是为了给出个参考系
  • 配置较低,更多配置、协议、序列化测试欢迎各位道友自行进行,压测代码: server, client

示例工程

  • 用arpc作为基础设施实现了个发布订阅服务:achan,示例请参考README

README.md中错误的链接

你好,在根目录下的README.md中,gorilla Web 开发包之安全 cookie 库的链接貌似指向了shema,您应该指向securecookie,请你检查

推荐一个socks5的库

推荐自己这个库go-sock5是一份armon go-sock5 的镜像,仍执行原作者MIT Licese.原作者库年久未维护,所以镜像了一份.
因为我增加了许多特性,破坏了原库众多api,主要为了并发性和扩展性,增加众多代码覆盖性测试,并实现了客户端,客户端算是试验性支持.

Watermill

看了您了解到Watermill这个包,但如果我想有多个订阅者订阅同一个topic,那么多个订阅者都会消费这个消息,有没有办法只有一个订阅者消费这个消息,不重复消费... 谢谢!

推荐RxGo

Reactive Extensions for the Go Language,使用RxGo可以更轻松地编写并发调用代码

package main

import (
	"context"
	"errors"
	"fmt"
	"log"
	"time"

	"github.com/Pallinder/go-randomdata"
	"github.com/ahmetb/go-linq"
	"github.com/reactivex/rxgo/v2"
)

// ParallelCase1 并发获取不同类型字段信息
func ParallelCase1(ctx context.Context) {
	type Student struct {
		ID      int64
		Name    string
		Age     int64
		Teacher string
	}

	student := Student{ID: 1}
	getNameByID := func() (interface{}, error) {
		time.Sleep(1 * time.Second)
		fmt.Println("getNameByID Success")
		return func() { student.Name = "kangkang" }, nil
	}
	getAgeByID := func() (interface{}, error) {
		time.Sleep(3 * time.Second)
		fmt.Println("getAgeByID Success")
		return func() { student.Age = 13 }, nil
	}
	getTeacherByID := func() (interface{}, error) {
		time.Sleep(2 * time.Second)
		fmt.Println("getTeacherByID failed")
		return nil, errors.New("ERROR!")
	}

	for item := range rxgo.Just(getNameByID, getAgeByID, getTeacherByID)().Map(
		// 执行并发任务
		func(ctx context.Context, item interface{}) (interface{}, error) {
			f := item.(func() (interface{}, error))
			return f()
		},
		// 配置并发策略
		rxgo.WithPool(3),
		rxgo.WithErrorStrategy(rxgo.StopOnError),
		rxgo.WithContext(ctx),
	).Observe() {
		if item.E != nil {
			log.Fatal(item.E)
		}
		// 获取并发任务执行结果
		f := item.V.(func())
		f()
	}

	fmt.Printf("student: %+v", student)
}

// ParallelCase2 并发处理同类型字段信息
func ParallelCase2(ctx context.Context) {
	idList, _ := rxgo.Range(1, 100).ToSlice(100)
	var nameList []string

	itemList, err := rxgo.Just(idList)().Map(
		func(ctx context.Context, item interface{}) (interface{}, error) {
			randNum := randomdata.Number(0, 3)
			time.Sleep(time.Duration(randNum) * time.Second)
			if randNum == 1 {
				return nil, errors.New("[RANDOM ERROR]")
			}
			randName := randomdata.SillyName()
			fmt.Printf("randNum: %d, randName: %s\n", randNum, randName)
			return randName, nil
		},
		rxgo.WithPool(20),                            // 最大并发数
		rxgo.WithBufferedChannel(20),                 // 带缓存接收
		rxgo.WithContext(ctx),                        // 传递context进行链路追踪
		rxgo.WithErrorStrategy(rxgo.ContinueOnError), // 错误处理策略
	).ToSlice(len(idList))
	if err != nil {
		log.Fatalf("[RXGO ERROR]: %+v", err)
	}

	linq.From(itemList).SelectT(
		func(item string) string { return item },
	).ToSlice(&nameList)

	fmt.Printf("nameList: %+v", nameList)
}

func main() {
	ctx := context.Background()
	ParallelCase1(ctx)
	ParallelCase2(ctx)
}

zap

大佬 有沒有 zap 的讲解篇的?

struct拷贝

相同struct数据合并的mergo,不同struct数据的copier库考虑下呗。 要是有更好的也推荐下,目前就找到这两。
要是权限库casbin能考虑更好了

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.