go汇编入门

文章分享lrita 发表了文章 • 0 个评论 • 14 次浏览 • 1 小时前 • 来自相关话题

golang echo 代码详解之模版篇

技术讨论Laily 发表了文章 • 0 个评论 • 15 次浏览 • 2 小时前 • 来自相关话题

在 echo 里使用模版则必须先注册一个,如果不注册就会报出下面这样的错误

{"time":"2017-12-12T23:... 			查看全部
					

在 echo 里使用模版则必须先注册一个,如果不注册就会报出下面这样的错误


{"time":"2017-12-12T23:03:57.939138716+08:00","level":"ERROR","prefix":"echo","file":"echo.go","line":"284","message":"Renderer not registered"}

注册就是给 echo.Renderer 赋值。


echo 的 Renderer 属性是一个接口


Renderer interface {
Render(io.Writer, string, interface{}, Context) error
}

一、使用标准库模版


echo 的文档给出了使用官方模版注册的方式


// 实现 Renderer 接口
type Template struct {
templates *template.Template
}

func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
return t.templates.ExecuteTemplate(w, name, data)
}
// 处理 view 目录下的文件生成对应的模版
// 关于 ExecuteTemplate 和 ParseGlob 方法可以查看
// https://wizardforcel.gitbooks. ... plate
t := &Template{
templates: template.Must(template.ParseGlob("public/views/*.html")),
}
// 赋值
e.Renderer = t

二、使用 pongo2


gopkg.in/flosch/pongo2.v3 是一个很不错的模版引擎,很多时候会选择它来渲染模版。


首先还是实现 Renderer 接口


type Template struct {
// 这里使用一个 map 来存储预处理了的模版
tmplMap map[string]*pongo2.Template
}

func (t *Template) Render(w io.Writer, templateName string, data interface{}, c echo.Context) error {
// 这里根据传来的 name 从 tmplMap 里查找模版来渲染
// 注意 ExcuteWriter 的参数必须是 map[string]interface{} 的
dataMap := data.(map[string]interface{})
template, exist := t.tmplMap[templateName]
if !exist {
return errors.New("template " + templateName + " not found")
}
return template.ExecuteWriter(dataMap, w)
}

然后预编译模版


// 读取目录下的文件预处理
func preCompile(dir string) *Template {
tmplMap := make(map[string]*pongo2.Template)

dirPath := filepath.Dir(dir)
fileInfos, _ := ioutil.ReadDir(dirPath)

for _, fileInfo := range fileInfos {
t, err := pongo2.FromFile(path.Join(dir, fileInfo.Name()))
if err != nil {
log.Fatalf("\"%s\": %v", fileInfo.Name(), err)
}
tmplMap[strings.Replace(fileInfo.Name(), path.Ext(fileInfo.Name()), "", -1)] = t

}

return &Template{tmplMap}
}

最后赋值


func NewTemplates(dir string) *Template {
return preCompile(dir)
}

t := NewTemplates("./views/")
e.Renderer = t

这样自定义的 renderer 就算完成了。


原文地址:laily.net

go超级时间轮timewheel(一路向前)github.com/anjieych/timewheel

开源程序Anjie 发表了文章 • 0 个评论 • 49 次浏览 • 5 小时前 • 来自相关话题

go超级时间轮timewheel(一路向前)github.com/anjieych/timewheel

有传统时间轮的影子,但又超出传统时间轮:

  1. 非“盘/环”形结构: 一路向前,永... 查看全部

go超级时间轮timewheel(一路向前)github.com/anjieych/timewheel


有传统时间轮的影子,但又超出传统时间轮:



  1. 非“盘/环”形结构:
    一路向前,永不回头,每tick一次,移除一个slot;每个slot中的entity 触发OnExpired来处理到期(或过期)事件;

  2. 超级时间轮:
    他是一个轮或者轮的集合,因为他可以同时处理不同实现了Entity的业务,每个业务有各自OnExpired定义,只要可以遵循相同的时间刻度Interval就可以放入同一个轮来统一计时触发。
    最后,优点或缺点可以作者交流。


[========]


package main

import (
"fmt"
"github.com/anjieych/timewheel"
"time"
)

func main() {
tw := timewheel.NewTimewheel("tw-example", time.Second)
tw.Start()
tick := time.NewTicker(3 * time.Second)
for {
d := &Data{
eid: time.Now().UnixNano(),
data: <-tick.C,
}
d.SetSlotId(tw.Add(d, 5*time.Second))
}
}
// Data must implements timewheel.Entity
type Data struct {
eid int64
slotId int
data interface{}
}

func (d *Data) SetEId(eId int64) {
d.eid = eId
}
func (d *Data) GetEId() (eId int64) {
return d.eid
}
func (d *Data) SetSlotId(slotId int) {
d.slotId = slotId
}
func (d *Data) GetSlotId() (slotId int) {
return d.slotId
}
func (d *Data) OnExpired() {
fmt.Printf("%s\t OnExpired :{slotId: %d\t,eid: %d\t,data: %s}\n", time.Now(), d.GetSlotId(), d.GetEId(), d.data)
}

RobotGo v0.47.0 发布, Go 桌面自动化, 移除 libpng 等依赖

回复

开源程序veni 发起了问题 • 1 人关注 • 0 个回复 • 113 次浏览 • 6 小时前 • 来自相关话题

GOCN每日新闻(2017-12-12)

回复

每日新闻傅小黑 发起了问题 • 1 人关注 • 0 个回复 • 227 次浏览 • 14 小时前 • 来自相关话题

beego static 文件下载

回复

有问必答lvxiaorun 发起了问题 • 2 人关注 • 0 个回复 • 70 次浏览 • 1 天前 • 来自相关话题

GoCN每日新闻(2017-12-11)

回复

每日新闻kevin 发起了问题 • 1 人关注 • 0 个回复 • 339 次浏览 • 1 天前 • 来自相关话题

GoCN每日新闻(2017-12-10)

回复

每日新闻罗发宣 发起了问题 • 2 人关注 • 0 个回复 • 300 次浏览 • 2 天前 • 来自相关话题

GoCN每日新闻(2017-12-09)

回复

每日新闻samurai 发起了问题 • 1 人关注 • 0 个回复 • 295 次浏览 • 4 天前 • 来自相关话题

fx 已经支持 Go, Node, Python, Ruby, Java, PHP, Julia 这些语言了

回复

开源程序metrue 发起了问题 • 1 人关注 • 0 个回复 • 238 次浏览 • 4 天前 • 来自相关话题

链家网诚聘Go工程师

招聘应聘bingful 发表了文章 • 0 个评论 • 270 次浏览 • 4 天前 • 来自相关话题

工作职责:

  1. 链家网千万用户和经纪人之间的纽带--即时通讯服务的核心服务开发
  2. 链家网基础架构部高可用服务建设
  3. 依托链家平台,打造可扩展高性能的企业服务平台

任职要求:... 查看全部

工作职责:



  1. 链家网千万用户和经纪人之间的纽带--即时通讯服务的核心服务开发

  2. 链家网基础架构部高可用服务建设

  3. 依托链家平台,打造可扩展高性能的企业服务平台


任职要求:



  1. 有责任心,有OWNER意识

  2. 工作经历3年以上,对计算机网络、分布式系统、操作系统等方面有深度的积累

  3. 代码工程能力突出


招聘部门:
链家集团旗下链家网(北京)科技有限公司 基础架构部。致力于链家集团内部基础设施建设。


我们提供:补充医保/免费3餐/五险一金/各种娱乐设备/免费按摩/五险一金/带薪年假/行业技术会议和培训/晋升体系


投简历请联系 qibing@lianjia.com


附上一些公司团队活动:
公司星座生日会
公司星座生日会


公司黑客马拉松之后我们团队的聚餐
黑客马拉松聚餐

GoCN每日新闻(2017-12-08)

回复

每日新闻cloudy 发起了问题 • 1 人关注 • 0 个回复 • 270 次浏览 • 4 天前 • 来自相关话题

GoCN每日新闻(2017-12-07)

回复

每日新闻data_worm 发起了问题 • 1 人关注 • 0 个回复 • 382 次浏览 • 5 天前 • 来自相关话题

分享一个带 TTL 以及失效回调的 LRU 库. https://github.com/Akagi201/kvcache

开源程序Akagi201 发表了文章 • 0 个评论 • 108 次浏览 • 6 天前 • 来自相关话题

https://github.com/Akagi201/kvcache

完美达到我的业务需要的效果. 大家有同样的需求可以测试测试.

...

https://github.com/Akagi201/kvcache


完美达到我的业务需要的效果. 大家有同样的需求可以测试测试.


有问题一定向我反馈. akagi201@gmail.com

GoCN每日新闻(2017-12-06)

回复

每日新闻moss 发起了问题 • 1 人关注 • 0 个回复 • 397 次浏览 • 6 天前 • 来自相关话题