闲来无事,想开个github开源项目一起,主要是做个微信支付和支付宝的go版本,欢迎加入

tupunco 回复了问题 • 4 人关注 • 4 个回复 • 686 次浏览 • 2017-11-01 08:17 • 来自相关话题

使用 Ruby on Rails 开发 Go 接口

B1nj0y 发表了文章 • 0 个评论 • 281 次浏览 • 2017-10-03 10:25 • 来自相关话题

下面这篇文章介绍了如何使用 Ruby on Rails 框架开发 Go 应用的一个 gem: go-on-rails

文章首发在 Rub... 查看全部

下面这篇文章介绍了如何使用 Ruby on Rails 框架开发 Go 应用的一个 gem: go-on-rails


文章首发在 RubyChina: https://ruby-china.org/topics/34289

创建自己的beats组件时,按照官网给的流程,设置完成,运行make时出现 Hostname, Part未定义

回复

KSpeer 回复了问题 • 1 人关注 • 1 个回复 • 437 次浏览 • 2017-09-01 14:45 • 来自相关话题

Gop - 编译和管理在GOPATH之外的Go工程

ilovekitty328 回复了问题 • 3 人关注 • 1 个回复 • 451 次浏览 • 2017-08-17 19:23 • 来自相关话题

Go 实现泛型展开以及展开时计算

taowen 发表了文章 • 0 个评论 • 563 次浏览 • 2017-07-21 18:58 • 来自相关话题

实现代码: https:/... 查看全部

实现代码: https://github.com/v2pro/wombat/tree/master/fp


泛型展开


泛型展开不是简单的类型替换。在C++中有模板偏特化,以及由此发展出来一系列实现编译期计算的奇技淫巧,直到最后以constexpr变成语言的一部分。D语言的static if也是类似的,在编译期实现了D语言的一个子集。在 Go 2.0 中即便支持了泛型,要达到D语言的高度,可能还需要很长的路要走。所以目前最佳的方案还是用代码生成的方案。但是纯手写的代码生成没有办法做到很复杂的泛型代码的组合,比如一个泛型函数调用另外一个泛型函数之类的。所以 wombat 的实现目标是设计一个能够支撑大规模代码生成的机制,使得复杂的utility能够被广泛复用。这些utility可能简单的如compare,max,复杂得如json编解码。


最简单的例子


定义一个泛型的函数


var compareSimpleValue = generic.DefineFunc("CompareSimpleValue(val1 T, val2 T) int").
Param("T", "the type of value to compare").
Source(`
if val1 < val2 {
return -1
} else if val1 == val2 {
return 0
} else {
return 1
}`)

测试一个泛型的函数


func init() {
generic.DynamicCompilationEnabled = true
}

func Test_compare_int(t *testing.T) {
should := require.New(t)
f := generic.Expand(compareSimpleValue, "T", generic.Int).
(func(int, int) int)
should.Equal(-1, f(3, 4))
should.Equal(0, f(3, 3))
should.Equal(1, f(4, 3))
}

注意,在init的时候,我们开启了动态编译。这样在测试的时候,实际上是直接在执行的时候生成代码,并用plugin的方式加载的。这样测试泛型代码就能达到和反射的实现一样的高效。


使用一个泛型的函数


func init() {
generic.Declare(compareSimpleValue, "T", generic.Int)
}

func xxx() {
f := generic.Expand(compareSimpleValue, "T", generic.Int).
(func(int, int) int)
f(3, 4)
}

因为没有开启动态编译,所以调用generic.Expand会失败。需要用 go install github.com/v2pro/wombat/cmd/codegen 编译出代码生成器。然后执行


codegen -pkg path-to-your-pkg

然后会在你的包下面生成 generated.go 文件。这样运行时generic.Expand 就不会报错了。


泛型展开时计算


如果需求不仅仅是支持int,还要支持int的指针。前面实现的函数模板是无法支持的。所以我们需要能够,在泛型展开的时候进行类型判断,选择不同的实现。


var ByItself = generic.DefineFunc("CompareByItself(val1 T, val2 T) int").
Param("T", "the type of value to compare").
Generators("dispatch", dispatch).
Source(`
{{ $compare := expand (.T|dispatch) "T" .T }}
return {{$compare}}(val1, val2)`)

func dispatch(typ reflect.Type) string {
switch typ.Kind() {
case reflect.Int:
return "CompareSimpleValue"
case reflect.Ptr:
return "ComparePtr"
}
panic("unsupported type: " + typ.String())
}

其中dispatch就是一个go语言实现的函数,可以在展开模板的时候被调用,用于选择具体的实现。然后调用expand来把对应的模板再展开,然后调用。


递归展开


ComparePtr其实无法确认自己一定是调用CompareSimpleValue。因为可能还有**int,以及***int这样的情况。所以,ComparePtr在对指针进行取消引用之后,再次调用CompareByItself进行递归展开模板。


func init() {
ByItself.ImportFunc(comparePtr)
}

var comparePtr = generic.DefineFunc("ComparePtr(val1 T, val2 T) int").
Param("T", "the type of value to compare").
ImportFunc(ByItself).
Source(`
{{ $compare := expand "CompareByItself" "T" (.T|elem) }}
return {{$compare}}(*val1, *val2)`)

ByItself.ImportFunc(comparePtr) 是为了避免循环引用自身而引入的。否则两个函数就会循环引用,导致编译失败。具有了这样的函数模板化的能力,我们可以把JSON编解码这样的复杂的utility也用模板的方式写出来。


泛型容器


除了支持模板函数之外,struct也可以加模板。写法如下:


var Pair = generic.DefineStruct("Pair").
Source(`
{{ $T1 := .I | method "First" | returnType }}
{{ $T2 := .I | method "Second" | returnType }}

type {{.structName}} struct {
first {{$T1|name}}
second {{$T2|name}}
}

func (pair *{{.structName}}) SetFirst(val {{$T1|name}}) {
pair.first = val
}

func (pair *{{.structName}}) First() {{$T1|name}} {
return pair.first
}

func (pair *{{.structName}}) SetSecond(val {{$T2|name}}) {
pair.second = val
}

func (pair *{{.structName}}) Second() {{$T2|name}} {
return pair.second
}`)

其中固定了一个模板参数叫,I。这个是指模板struct需要实现的interface。比如,如果用<int,string>来展开struct,对应的interface应该是:


type IntStringPair interface {
First() int
SetFirst(val int)
Second() string
SetSecond(val string)
}

使用的代码需要用这个interface来创建pair的实例:


func init() {
generic.DynamicCompilationEnabled = true
}

func Test_pair(t *testing.T) {
type IntStringPair interface {
First() int
SetFirst(val int)
Second() string
SetSecond(val string)
}
should := require.New(t)
intStringPairType := reflect.TypeOf(new(IntStringPair)).Elem()
pair := generic.New(Pair, intStringPairType).(IntStringPair)
should.Equal(0, pair.First())
pair.SetFirst(1)
should.Equal(1, pair.First())
}

go有没有有意思的且值的学习的开源项目推荐

woshicixide 回复了问题 • 2 人关注 • 2 个回复 • 752 次浏览 • 2017-07-20 09:21 • 来自相关话题

LiteIDE X31 发布,Go 语言开发工具

visualfc 发表了文章 • 1 个评论 • 819 次浏览 • 2017-03-03 08:33 • 来自相关话题

Go 语言开发工具 LiteIDE X31发布了。

新版本修复错误,优化了编辑体验。此版本增加了命令行支持重置用户设置,更新了文件向导功能,增加了空闲时文档自动保存功能,解决编辑器重载定位,重新恢复编辑工具栏,优化代码自动完成,增加大纲与编... 查看全部

Go 语言开发工具 LiteIDE X31发布了。


新版本修复错误,优化了编辑体验。此版本增加了命令行支持重置用户设置,更新了文件向导功能,增加了空闲时文档自动保存功能,解决编辑器重载定位,重新恢复编辑工具栏,优化代码自动完成,增加大纲与编辑器同步功能,修复macOS上目录同步错误和dlv加载问题等。此版本支持go1.8。


下载地址



更新记录



  • LiteIDE

    • add command line liteide [files|folder] [--select-env id] [--local-setting] [--user-setting] [--reset-setting]


  • LiteApp

    • add application idle timer automatic save documents option

    • folders are not sorted to resolve sync editing errors on MacOS

    • update new file wizard


  • GolangPackage

    • update GOPATH setup


  • GolangCode

    • update env load


  • GolangAst

    • classview and outline add sync editor action


  • DlvDebugger

    • fix dlv execution on MacOS


  • FakeVim

    • option add load default command list action


  • LiteEditor

    • fix editor restore vertical scrollbar postion

    • fix codecompleter prefix min setup

    • restore the editor toolbar

    • option add mimetype custom extsition setup


  • LiteBuild

    • build config xml file enable custom $() on cmd and args


TiDB Weekly [2017.02.13]

qiuyesuifeng 发表了文章 • 0 个评论 • 406 次浏览 • 2017-02-18 13:54 • 来自相关话题

Weekly update in TiDB

Last two weeks, we landed 查看全部

Weekly update in TiDB


Last two weeks, we landed 25 PRs in the TiDB repositories.


Added



Fixed



Improved



Weekly update in TiKV


Last week, We landed 14 PRs in the TiKV repositories.


Added



Fixed



Improved



原文链接

TiDB Weekly [2017.02.05]

qiuyesuifeng 发表了文章 • 0 个评论 • 374 次浏览 • 2017-02-18 13:52 • 来自相关话题

Weekly update in TiDB

Last two weeks, we landed 查看全部

Weekly update in TiDB


Last two weeks, we landed 43 PRs in the TiDB repositories.


Added



Fixed



Improved



Weekly update in TiKV


Last two weeks, we landed 20 PRs in the TiKV repositories.


Added



Fixed



Improved



原文链接

好玩的github项目-用go做个flappy bird

wwdyy 发表了文章 • 1 个评论 • 730 次浏览 • 2017-02-06 22:46 • 来自相关话题

flappy gopher

转自github用户neomede

A flappy bird clone made in go. 查看全部

flappy gopher


转自github用户neomede


A flappy bird clone made in go.


Based on this video and this project by Francesc Campoy, also this project by Sab


Play


Just run "make run" and use any button to jump


github地址:https://github.com/neomede/flappy

TiDB Weekly [2017.01.24]

qiuyesuifeng 发表了文章 • 0 个评论 • 460 次浏览 • 2017-02-04 11:43 • 来自相关话题

Weekly update in TiDB

Last two weeks, we landed 查看全部

Weekly update in TiDB


Last two weeks, we landed 87 PRs in the TiDB repositories.


Added



Fixed



Improved



New contributor



Weekly update in TiKV


Last two weeks, We landed 50 PRs in the TiKV repositories.


Added



Fixed



Improved



原文链接

TiDB Weekly [2017.01.08]

qiuyesuifeng 发表了文章 • 0 个评论 • 367 次浏览 • 2017-02-04 11:42 • 来自相关话题

Weekly update in TiDB

Last week, we landed 查看全部

Weekly update in TiDB


Last week, we landed 38 PRs in the TiDB repositories.


Added



Fixed



Improved



New contributor



Weekly update in TiKV


Last week, We landed 15 PRs in the TiKV repositories.


Added



Fixed



  • Check cluseter ID to avoid PD joining different cluster.


Improved



原文链接

TiDB Weekly [2017.01.01]

qiuyesuifeng 发表了文章 • 0 个评论 • 408 次浏览 • 2017-01-07 13:13 • 来自相关话题

Weekly update in TiDB

Last week, we landed 查看全部

Weekly update in TiDB


Last week, we landed 28 PRs in the TiDB repositories.


Added



Fixed



Improved



New contributor



Weekly update in TiKV


Last week, We landed 19 PRs in the TiKV repositories.


Added




  • Move raw_get to thread pool.




  • Add ResourceKind for operator and don't resend duplicated AddPeer response when the peer is still pending, see #449.



  • Add member command for pd-ctl.


Fixed



Improved



原文链接

TiDB Weekly [2016.12.26]

qiuyesuifeng 发表了文章 • 0 个评论 • 364 次浏览 • 2017-01-07 13:12 • 来自相关话题

New Release

TiDB RC1 is released!

Weekly updat... 查看全部

New Release


TiDB RC1 is released!


Weekly update in TiDB


Last week, we landed 34 PRs in the TiDB repositories.


Added



Fixed



Improved



New contributor



Weekly update in TiKV


Last week, We landed 14 PRs in the TiKV repositories.


Added



Fixed



Improved



原文链接

TiDB Weekly [2016.12.19]

qiuyesuifeng 发表了文章 • 0 个评论 • 427 次浏览 • 2016-12-25 13:46 • 来自相关话题

Weekly update in TiDB

Last week, we landed 查看全部

Weekly update in TiDB


Last week, we landed 32 PRs in the TiDB repositories.


Added



Fixed



Improved



New contributor



Weekly update in TiKV


Last week, we landed 11 PRs in the TiKV repositories.


Added



Fixed



Improved



原文链接