go 如何定时执行

有问必答zituocn 回复了问题 • 6 人关注 • 3 个回复 • 491 次浏览 • 2016-10-28 11:58 • 来自相关话题

复杂的项目里可以使用.的方式导入包吗?

有问必答tt_0411 回复了问题 • 3 人关注 • 3 个回复 • 475 次浏览 • 2016-10-28 00:04 • 来自相关话题

好玩的github项目-微信公众号爬虫 (只需设置代理, 一键可以爬取所有历史文章)

Go开源项目wwdyy 发表了文章 • 4 个评论 • 1395 次浏览 • 2016-10-27 23:32 • 来自相关话题

转自github用户:sundyli

使用方法: 运行后, 设置手机的代理为 本机ip 8899端口, 打开微信客户端, 点击任一公众号查看历史文章按钮, 即可爬取该公众号的所有历史文章(已经支持自动翻页爬取)

自定义输出源,... 查看全部

转自github用户:sundyli


使用方法: 运行后, 设置手机的代理为 本机ip 8899端口, 打开微信客户端, 点击任一公众号查看历史文章按钮, 即可爬取该公众号的所有历史文章(已经支持自动翻页爬取)


自定义输出源,实现Processor接口的Output方法即可, custom_output_server.go


微信会屏蔽频繁的请求,所以历史文章的翻页请求调用了Sleep()方法, 默认每个请求休眠50ms,可以根据实际情况自定义Processor覆盖此方法


一个简单的Demo simple_server.go


package main

import (
"log"
"net/http"

"github.com/sundy-li/wechat_spider"

"github.com/elazarl/goproxy"
)

func main() {
var port = "8899"
proxy := goproxy.NewProxyHttpServer()
//open it see detail logs
// wechat_spider.Verbose = true
proxy.OnResponse().DoFunc(
wechat_spider.ProxyHandle(wechat_spider.NewBaseProcessor()),
)
log.Println("server will at port:" + port)
log.Fatal(http.ListenAndServe(":"+port, proxy))

}

github链接:https://github.com/sundy-li/wechat_spider

关于fmt包优先打印类型Stringf方法结果的疑问?

有问必答stevewang 回复了问题 • 2 人关注 • 1 个回复 • 354 次浏览 • 2016-10-27 22:25 • 来自相关话题

‘话题描述’ 显示有问题?

站点反馈astaxie 回复了问题 • 2 人关注 • 1 个回复 • 357 次浏览 • 2016-10-27 21:27 • 来自相关话题

beego的orm针对postgresql的jsonb字段的查询

有问必答astaxie 回复了问题 • 3 人关注 • 2 个回复 • 469 次浏览 • 2016-10-27 21:13 • 来自相关话题

钛核互动急招运维开发工程师的职位

招聘应聘lisa_zhao 发表了文章 • 1 个评论 • 271 次浏览 • 2016-10-27 17:44 • 来自相关话题

关于我们: 钛核互动成立于2014年10月,创始人团队在游戏行业从业平均达十年以上,做出了多款移动和家用机平台上的大作(永恒战士系列,口袋商业街系列,暴走!僵尸之城,蚯蚓战士等)。 钛核致力于建立平等,放权和高效的公司文化,招募和培养精英成员,营造宽松但... 查看全部

关于我们:
钛核互动成立于2014年10月,创始人团队在游戏行业从业平均达十年以上,做出了多款移动和家用机平台上的大作(永恒战士系列,口袋商业街系列,暴走!僵尸之城,蚯蚓战士等)。
钛核致力于建立平等,放权和高效的公司文化,招募和培养精英成员,营造宽松但有激情的开发氛围,追求在智能手机平台上制作出即叫好又叫座的精品游戏!


创始人团队:
 姚乐中,制作人,04年进入手机游戏开发领域,在美国硅谷工作多年后回到北京,将Glu北京工作室建设成业界一流的工作室,是Glu在中国和亚太成功的主要推动者;
 殷炜晔(Franc),美术总监,国际CG界最早成名的华人艺术家之一,十一年游戏领域美术经验, 原Glu北京工作室美术总监,个人作品集见 www.franc-art.com
 尹泽弘,技术总监,先后在Gameloft和Glu任职技术经理和技术总监,顶尖的全平台游戏技术专家,亚马逊云服务专家;
 王亮,首席工程师,十五年技术领域经验,系统优化,图形,网络领域的专家。


你将获得
你会和一群有多年经验却不忘初心,努力同时达到高制作水准和商业成功的人一起做游戏。
 产品和设计:我们在核心和休闲方向都获得过系列成功;
 技术:我们是国内最早使用Unity3D引擎的团队,在3D动作游戏领域有深厚积累,常年和Unity支持部门进行源码级交流;
 美术:你会和业界少有的在2D和3D领域,艺术和技术领域均有超强能力的美术大神Franc带领的美术团队合作。


我们希望找到
 热爱做游戏的人;
 有专长的综合性人才;
 自我驱动,用心做事的人;
 有信心建立伟大游戏公司的人。


系统运维工程师
任职要求:
 计算机相关专业本科以上学历,熟悉Linux系统自动化运维工作经验。
 负责日常的服务器软硬件、系统与应用平台管理,包括但不限于状态监控、升级、故障处理及优化等操作;
 负责系统日常管理流程的script编写,生产环境各种应用的服务器的安装、配置、管理、优化和监控;
 配合开发项目的环境搭建,与需求方就具体的技术点进行沟通等等。
 负责加固系统、优化系统,提升系统安全性或构建新的系统;
 英文阅读能力强
加分项:
 有任何云服务使用经验(AWS, 阿里云, 腾讯云,青云,UCloud)
 熟练使用shell、python、perl、php等脚本编程语言
 熟悉MongoDB, Redis, Mysql优先
 熟悉负载均衡技术、HA,精通服务器性能优化,有大流量服务器压力管理经验者优先。
 熟练配置防火墙、路由器、交换机等网络设备。有大型存储设备使用经验


工作地点:北京 朝阳 四惠
Email:lisa@taiyouxi.cn
lisa : 3348361317

关于使用第三方库错误(error)的判断

有问必答willee 回复了问题 • 3 人关注 • 2 个回复 • 480 次浏览 • 2016-10-27 17:44 • 来自相关话题

钛核互动急招Go服务器工程师的职位-想做游戏的看过来

招聘应聘lisa_zhao 回复了问题 • 3 人关注 • 2 个回复 • 532 次浏览 • 2016-10-27 17:40 • 来自相关话题

根据dockerfile docker build 遇到的错误

有问必答zradelaide1122 回复了问题 • 2 人关注 • 2 个回复 • 352 次浏览 • 2016-10-27 14:59 • 来自相关话题

stdin 和命令行(例如:-dir some/path/to/dir ) 是一回事吗

有问必答stevewang 回复了问题 • 2 人关注 • 1 个回复 • 251 次浏览 • 2016-10-27 14:14 • 来自相关话题

如何看待golang(1.9?)新的GC 的Proposal?

有问必答niugou 回复了问题 • 14 人关注 • 6 个回复 • 1950 次浏览 • 2016-10-27 13:15 • 来自相关话题

go如何调用exe并捕获输出?

有问必答philosophia14 回复了问题 • 2 人关注 • 2 个回复 • 374 次浏览 • 2016-10-27 13:13 • 来自相关话题

Docker与Golang的巧妙结合

文章分享田浩浩 发表了文章 • 0 个评论 • 423 次浏览 • 2016-10-27 11:48 • 来自相关话题

译文转载:Docker与Golang的巧妙结合


【编者的话】这是一个展示在使用Go语言时如何让Dock... 查看全部

译文转载:Docker与Golang的巧妙结合




【编者的话】这是一个展示在使用Go语言时如何让Docker更有用的提示与技巧的简辑。例如,如何使用不同版本的Go工具链来编译Go代码,如何交叉编译到不同的平台(并且测试结果!),或者如何制作真正小的容器镜像。


下面的文章假定你已经安装了Docker。不必是最新版本(这篇文章不会使用Docker任何花哨的功能)。


没有go的Go


...意思是:“不用安装go就能使用Go”


如果你写Go代码,或者你对Go语言有一点点兴趣,你肯定要安装了Go编译器和Go工具链,所以你可能想知道:“重点是什么?”;但有些情况下,你想不安装Go就来编译Go。



  • 机器上依旧有老版本Go 1.2(你不能或不想更新),不得不使用这个代码库,需要一个高版本的工具链。

  • 想使用Go1.5的交叉编译功能(例如,确保能从一个Linux系统创建操作系统X的二进制文件)。

  • 想拥有多版本的Go,但不想完全弄乱系统。

  • 想100%确定项目和它所有的依赖,下载,建立和运行在一个纯净的系统上。


如果遇到上述情况,找Docker来解决!


在容器里编译一个程序


当你安装了Go,你可以执行go get -v github.com/user/repo来下载,创建和安装一个库。(-v只是信息显示,如果你喜欢工具链快速和静默地运行,可以将它移除!)


你也可以执行go get github.com/user/repo/...来下载,创建和安装那个repo(包括库和二进制文件)里面所有的东西。


我们可以在一个容器里面这样做!


试试这个:


docker run golang go get -v github.com/golang/example/hello/...

这将拉取golang镜像(除非你已经有了,那它会马上启动),并且创建一个基于它的容器。在那个容器里,go会下载一个“hello world”的例子,创建它,安装它。但它会把它安装到这个容器里……我们现在怎么运行那个程序呢?


在容器里运行程序


一个办法是提交我们刚刚创建的容器,即,打包它到一个新的镜像:


docker commit $(docker ps -lq) awesomeness

注意:docker ps –lq输出最后一个执行的容器的ID(只有ID!)。如果你是机器的唯一用户,并且你从上一个命令开始没有创建另一个容器,那这个容器就是你刚刚创建的“hello world”的例子。


现在,可以用刚刚构建的镜像创建容器来运行程序:


docker run awesomeness hello

输出会是Hello, Go examples!


闪光点


当用docker commit构建镜像时,可以用--change标识指定任意Dockerfile命令。例如,可以使用一个CMD或者ENTRYPOINT命令以便docker run awesomeness自动执行hello。


在一次性容器上运行


如果不想创建额外的镜像只想运行这个Go程序呢?


使用:


docker run --rm golang sh -c \
"go get github.com/golang/example/hello/... && exec hello"

等等,那些花哨的东西是什么?



  • --rm 告诉Docker CLI一旦容器退出,就自动发起一个docker rm命令。那样,不会留下任何东西。

  • 使用shell逻辑运算符&&把创建步骤(go get)和执行步骤(exec hello)联接在一起。如果不喜欢shell,&&意思是“与”。它允许第一部分go get...,并且如果(而且仅仅是如果!)那部分运行成功,它将执行第二部分(exec hello)。如果你想知道为什么这样:它像一个懒惰的and计算器,只有当左边的值是true才计算右边的。

  • 传递命令到sh –c,因为如果是简单的做docker run golang "go get ... && hello",Docker将试着执行名为go SPACE get SPACE etc的程序。并且那不会起作用。因此,我们启动一个shell,并让shell执行命令序列。

  • 使用exec hello而不是hello:这将使用hello程序替代当前的进程(我们刚才启动的shell)。这确保hello在容器里是PID 1。而不是shell的是PID 1而hello作为一个子进程。这对这个微小的例子毫无用处,但是当运行更有用的程序,这将允许它们正确地接收外部信号,因为外部信号是发送给容器里的PID 1。你可能会想,什么信号啊?好的例子是docker stop,发送SIGTERM给容器的PID 1。


使用不同版本的Go


当使用golang镜像,Docker扩展为golang:latest,将(像你所猜的)映射到Docker Hub上的最新可用版本。


如果想用一个特定的Go版本,很容易:在镜像名字后面用那个版本做标签指定它。


例如,想用Go 1.5,修改上面的例子,用golang:1.5替换golang


docker run --rm golang:1.5 sh -c \
"go get github.com/golang/example/hello/... && exec hello"

你能在Docker Hub的Golang镜像页面上看到所有可用的版本(和变量)。


在系统上安装


好了,如果想在系统上运行编译好的程序,而不是一个容器呢?我们将复制这个编译了的二进制文件到容器外面。注意,仅当容器架构和主机架构匹配的时候,才会起作用;换言之,如果在Linux上运行Docker。(我排除的可能是运行Windows容器的人!)


最容易在容器外获得二进制文件的方法是映射$GOPATH/bin目录到一个本地目录,在golang容器里,$GOPATH/go.所以我们可以如下操作:


docker run -v /tmp/bin:/go/bin \
golang go get github.com/golang/example/hello/...
/tmp/bin/hello

如果在Linux上,将看到Hello, Go examples!消息。但如果是,例如在Mac上,可能会看到:


-bash:
/tmp/test/hello: cannot execute binary file

我们又能做什么呢?


交叉编译


Go 1.5具备优秀的开箱即用交叉编译能力,所以如果你的容器操作系统和/或架构和你的系统不匹配,根本不是问题!


开启交叉编译,需要设置GOOS和/或GOARCH


例如,假设在64位的Mac上:


docker run -e GOOS=darwin -e GOARCH=amd64 -v /tmp/crosstest:/go/bin \
golang go get github.com/golang/example/hello/...

交叉编译的输出不是直接在$GOPATH/bin,而是在$GOPATH/bin/$GOOS_$GOARCH.。换言之,想运行程序,得执行/tmp/crosstest/darwin_amd64/hello.


直接安装到$PATH


如果在Linux上,甚至可以直接安装到系统bin目录:


docker run -v /usr/local/bin:/go/bin \
golang get github.com/golang/example/hello/...

然而,在Mac上,尝试用/usr作为一个卷将不能挂载Mac的文件系统到容器。会挂载Moby VM(小Linux VM藏在工具栏Docker图标的后面)的/usr目录。(译注:目前Docker for Mac版本可以自定义设置挂载路径)


但可以使用/tmp或者在你的home目录下的什么其它目录,然后从这里复制。


创建依赖镜像


我们用这种技术产生的Go二进制文件是静态链接的。这意味着所有需要运行的代码包括所有依赖都被嵌入了。动态链接的程序与之相反,不包含一些基本的库(像“libc”)并且使用系统范围的复制,是在运行时确定的。


这意味着可以在容器里放弃Go编译好的程序,没有别的,并且它会运行。


我们试试!


scratch镜像


Docker生态系统有一个特殊的镜像:scratch.这是一个空镜像。它不需要被创建或者下载,因为定义的就是空的。


给新的Go依赖镜像创建一个新的空目录。


在这个新目录,创建下面的Dockerfile:


FROM scratch
COPY ./hello /hello
ENTRYPOINT ["/hello"]

这意味着:从scratch开始(一个空镜像),增加hello文件到镜像的根目录,*定义hello程序为启动这个容器后默认运行的程序。


然后,产生hello二进制文件如下:


docker run -v $(pwd):/go/bin --rm \
golang go get github.com/golang/example/hello/...

注意:不需要设置GOOSGOARCH,正因为,想要一个运行在Docker容器里的二进制文件,不是在主机上。所以不用设置这些变量!


然后,创建镜像:


docker build -t hello .

测试它:


docker run hello

(将显示“Hello, Go examples!”)


最后但不重要,检查镜像的大小:


docker images hello

如果一切做得正确,这个镜像大约2M。相当好!


构建东西而不推送到Github


当然,如果不得不推送到GitHub,每次编译都会浪费很多时间。


想在一个代码段上工作并在容器中创建它时,可以在golang容器里挂载一个本地目录到/go。所以$GOPATH是持久调用:docker run -v $HOME/go:/go golang ....


但也可以挂载本地目录到特定的路径上,来“重载”一些包(那些在本地编辑的)。这是一个完整的例子:


# Adapt the two following environment variables if you are not running on a Mac
export GOOS=darwin GOARCH=amd64
mkdir go-and-docker-is-love
cd go-and-docker-is-love
git clone git://github.com/golang/example
cat example/hello/hello.go
sed -i .bak s/olleH/eyB/ example/hello/hello.go
docker run --rm \
-v $(pwd)/example:/go/src/github.com/golang/example \
-v $(pwd):/go/bin/${GOOS}_${GOARCH} \
-e GOOS -e GOARCH \
golang go get github.com/golang/example/hello/...
./hello
# Should display "Bye, Go examples!"

网络包和CGo的特殊情况


进入真实的Go代码世界前,必须承认的是:在二进制文件上有一点点偏差。如果在使用CGo,或如果在使用net包,Go链接器将生成一个动态库。这种情况下,net包(里面确实有许多有用的Go程序!),罪魁祸首是DNS解析。大多数系统都有一个花哨的,模块化的名称解析系统(像名称服务切换),它依赖于插件,技术上,是动态库。默认地,Go将尝试使用它;这样,它将产生动态库。


我们怎么解决?


重用另一个版本的libc


一个解决方法是用一个基础镜像,有那些程序功能所必需的库。几乎任何“正规”基于GNU libc的Linux发行版都能做到。所以,例如,使用FROM debianFROM fedora,替代FROM scratch。现在结果镜像会比原来大一些;但至少,大出来的这一点将和系统里其它镜像共享。


注意:这种情况不能使用Alpine,因为Alpine是使用musl库而不是GNU libc。


使用自己的libc


另一个解决方案是像做手术般地提取需要的文件,用COPY替换容器里的。结果容器会小。然而,这个提取过程困难又繁琐,太多更深的细节要处理。


如果想自己看,看看前面提到的ldd和名称服务切换插件。


用netgo生成静态二进制文件


我们也可以指示Go不用系统的libc,用本地DNS解析代替Go的netgo


要使用它,只需在go get选项加入-tags netgo -installsuffix netgo



  • -tags netgo指示工具链使用netgo

  • -installsuffix netgo确保结果库(任何)被一个不同的,非默认的目录所替代。如果做多重go get(或go build)调用,这将避免代码创建和用不用netgo之间的冲突。如果像目前我们讲到的这样,在容器里创建,是完全没有必要的。因为这个容器里面永远没有其他Go代码要编译。但它是个好主意,习惯它,或至少知道这个标识存在。


SSL证书的特殊情况


还有一件事,你会担心,你的代码必须验证SSL证书;例如,通过HTTPS联接外部API。这种情况,需要将根证书也放入容器里,因为Go不会捆绑它们到二进制文件里。


安装SSL证书


再次,有很多可用的选择,但最简单的是使用一个已经存在的发布里面的包。


Alpine是一个好的选择,因为它非常小。下面的Dockerfile将给你一个小的基础镜像,但捆绑了一个过期的跟证书:


FROM alpine:3.4
RUN apk add --no-cache ca-certificates apache2-utils

来看看吧,结果镜像只有6MB!


注意:--no-cache选项告诉apk(Alpine包管理器)从Alpine的镜像发布上获取可用包的列表,不保存在磁盘上。你可能会看到Dockerfiles做这样的事apt-get update && apt-get install ... && rm -rf /var/cache/apt/*;这实现了(即在最终镜像中不保留包缓存)与一个单一标志相当的东西。


一个附加的回报:把你的应用程序放入基于Alpine镜像的容器,让你获得了一堆有用的工具。如果需要,现在你可以吧shell放入容器并在它运行时做点什么。


打包


我们看到Docker如何帮助我们在干净独立的环境里编译Go代码;如何使用不同版本的Go工具链;以及如何在不同的操作系统和平台之间交叉编译。


我们还看到Go如何帮我们给Docker创建小的,容器依赖镜像,并且描述了一些静态库和网络依赖相关的微妙联系(没别的意思)。


除了Go是真的适合Docker项目这个事实,我们希望展示给你的是,Go和Docker如何相互借鉴并且一起工作得很好!


致谢


这最初是在2016年GopherCon骇客日提出的。


我要感谢所有的校对材料、提出建议和意见让它更好的人,包括但不局限于:



所有的错误和拼写错误都是我自己的;所有的好东西都是他们的!


原文链接:Docker + Golang = <3(翻译:陈晏娥 审校:田浩浩

Golang 文件路径问题

回复

有问必答abaddon 发起了问题 • 1 人关注 • 0 个回复 • 365 次浏览 • 2016-10-27 10:34 • 来自相关话题