1
ShayneWang 2018-12-17 10:25:13 +08:00
插眼
|
2
hellojinjie 2018-12-17 10:26:27 +08:00 2
4. supervisorctl 或者 systemctl
|
3
Vogan 2018-12-17 10:28:02 +08:00
go 支持交叉编译;
go 编译出来的是二进制文件; 可用 systemd 管理; |
4
Ediacaran 2018-12-17 10:29:27 +08:00 1
1 应该是只有一个二进制文件,没见过 go 用动态链接库的
顺便插眼 |
6
ETiV 2018-12-17 10:34:42 +08:00 via iPhone 1
pm2 也支持任意可执行程序的运行的~
偷懒就都用 pm2 … 服务器上也可以用 docker 拉起来 |
7
richangfan 2018-12-17 10:37:08 +08:00
“一次编译,处处运行”不服
|
8
RqPS6rhmP3Nyn3Tm 2018-12-17 10:39:07 +08:00 via iPhone 3
go 是真的牛逼,跨架构直接编译成一个 binary,复制上去就能跑
我不会写 go,但是有一次编译 armv7 的 ss-go,指定 CPU 就能直接编译出一个 binary,没有任何依赖问题,对年轻的我造成了巨大的冲击 |
9
heimeil 2018-12-17 10:41:02 +08:00 1
1. 可以随意组织项目结构,随便分多少都行,只要你愿意;
2. GOPATH 一般情况都是一个,用目录区分,$GOPATH/src/<源码托管站域名>/<ID>/项目,不过也可以很随意,看个人或团队习惯; 3. 编译成二进制文件随便怎么改名都行,在 Linux 上只要保证权限正确就行了; 4. 我个人喜欢用 docker 托管,其他方法也很多。 另外 Golang 不是不用装环境,而是环境都在编译的二进制文件里面了,你会发现 Go 编译出来的二进制比.NET 之类的大太多了。 |
10
hnpyhyz 2018-12-17 10:42:23 +08:00 via iPhone
战略插眼
|
11
a719114136 2018-12-17 10:43:24 +08:00 1
1. go 编译时把所有用到的东西、运行环境都放到一个文件里了,所以其他平台没安装 go 也可以运行。至于生成多个块没研究过,go 编译时有个参数-buildmode,不知道能不能做到这个。
2. GOPATH 设置看习惯了,两种方式:每个项目有每个项目的 GOPATH,或者所有项目用一个 GOPATH。 3. 是 4. 进程管理工具都是通用的,有:supervisor,Upstart,Systemd 都可以 |
12
zarte 2018-12-17 10:45:21 +08:00 1
1.按微服务一个个开发。
2.我是在底下按文件夹分 3.是的 4.supervior 这类守护 |
13
v2xe2v 2018-12-17 10:46:02 +08:00 1
docker 了解一下
|
14
lfzyx 2018-12-17 10:49:24 +08:00 9
systemd
不管什么服务都推荐 docker 的,不是坏就是蠢 |
15
giuem 2018-12-17 10:49:56 +08:00 via iPhone 2
自从有了 go mod 之后,只要一个全局的 GOPATH,项目随便放,不需要非得放 GAPATH 下
|
16
zst 2018-12-17 10:52:05 +08:00 via Android 1
3.是的
4.用 systemd 就好 顺便问一下除了 go 还有有哪些不用安装依赖的😊 |
18
iwtbauh 2018-12-17 10:58:52 +08:00 via Android 6
这正是我讨厌 golang 的原因
必须静态连接,无法动态连接,为什么不能拨出来一个 libgolang.so ?如果系统中都是 golang 编写的程序,那得多浪费多少内存啊(同样的代码被数次加载到主存),你们发现没有,Google 的软件从来都是不管内存占用的 。 由于静态连接,导致无法使用 dlopen 等方法动态载入共享对象到内存。这对于希望在运行时动态加载二进制插件的程序是灾难性的。 由于静态连接,程序体积膨胀。 由于没有共享库机制,使二进制代码重用非常困难。 所以,我站 rust,不知道比 golang 高到哪里去了 |
20
wentaoliang 2018-12-17 11:03:31 +08:00 1
1.go 最后打包出来的可执行文件永远只有一个吗?有没有可能根据我的业务逻辑分别打包成几大块(例如:main、lib1、lib2 ),虽然好像这样意义也不大?
go 是静态编译, 所以是只有一个;但是也是可以采取动态编译的,如果你想根据业务逻辑分别打包还是比较难受的,建议还是静态编译。 2.写代码前需要设置 GOPATH。假如我有多个项目的话 GOPATH 是不是也得设置多个?那 GOBIN 好像只能设置一个啊。 对于多个项目你们是怎么弄的?还是 GOPATH 只有一个,在 src 下建不同的文件夹来区分项目吗,最后通过 go build 指定路径来打包吗? 1.9 版本之前确实 GOPATH 比较蛋疼, 要么设置一个 GOPATH, 所有项目都放一起;要么每个项目设置一个 GOPATH, 写个 shell 放项目下, 然后开发哪个项目就运行下切换下 GOPATH, 但是 1.9 版本引入了 go mod, 可以摆脱对 GOPATH 对依赖,也是未来 go 的官方解决方案, 推荐使用 go mod 3.假如我现在打包出来一个文件为 main,在 Linux 执行它的方式为./main (是这样的吧) 对的 4.go 有没有类似 Node.js 下的 pm2 这种守护进程管理工具? 你们在服务器上怎么部署的 go ?总不可能是 nohup 吧 supervisord 可以监控进程 |
21
fcten 2018-12-17 11:06:28 +08:00
编译成单个二进制文件不符合 unix KISS 的原则。不过 KISS 是一个对开发者友好,而使用者体验很差的原则……
|
22
wentaoliang 2018-12-17 11:07:22 +08:00
顺便有说静态编译体积大, 我倒感觉浪费一点体积换取运维的便利性还是值得的, 如果真的觉得太大,可以考虑 upx 套壳压缩
|
23
TinyKube 2018-12-17 11:12:17 +08:00
还是要区分场景,Go 在云原生+微服务场景还是能解决很多问题的
|
24
miniliuke 2018-12-17 11:13:26 +08:00 via Android
golang 有插件(动态库)的吧,仅 linux 可用,虽然没怎么用过
|
25
alichen 2018-12-17 11:16:21 +08:00 via iPhone
加上 cgo 的话交叉编译就难过了
|
26
iwtbauh 2018-12-17 11:18:12 +08:00 via Android
@liuxey #19
java 不一样,主流的 java 实现是编译为 java 字节码而不是二进制文件。gcj 我没用过就不说了。 golang 的诞生不就是为了取代 c++ 来“提高内存安全”,“提高编程效率”的吗,rust 也是在各方面和 c++ 比。可以说主战场是差不多的。现在好了,c++的某些重要优势被 golang 抛弃了,依赖这些优势的 c++程序员怎么可能转去 golang。 |
28
barbery 2018-12-17 11:23:54 +08:00
就是这么方便啊,进程监控用 supervisor 啊
|
29
jsfaint 2018-12-17 11:24:22 +08:00 1
Go 可以分成多个模块的~~
有几种方案 1. 动态库方案,编译成 C 的 shared library,这样可以用 C 或者其他语言去做交互 2. 用 Go 自带 plugin 去编译成特殊的动态库 3. 多个 binary 通过 rpc 通讯 |
30
circleee 2018-12-17 11:25:29 +08:00
插眼
|
31
zicla 2018-12-17 11:28:41 +08:00
插眼
|
32
iwtbauh 2018-12-17 11:31:09 +08:00 via Android
@trait #27
“ golang 对标 c#” 来源请求 在我看来,golang,rust 都是设计者讨厌 c++而诞生的。目的是做一个性能达到 c++并且简化编程、提升安全性的语言。所以是同一类的。 |
33
gamexg 2018-12-17 11:34:59 +08:00
如果用了 cgo(内嵌了 c 代码) 交叉编译就比较麻烦了,需要 c 的那一套交叉编译方式。
另外也不是完全的不依赖,很多情况下还会依赖于 glibc。 |
34
nekoyaki 2018-12-17 11:38:25 +08:00
go 程序是可以编译成动态链接的共享库的,好像只在 linux 平台上可以,没试过别的平台。
另外 go 可以被编译为 c 风格的库,嵌入到 python/ruby 里。 |
35
rockyou12 2018-12-17 11:41:43 +08:00
@trait go 最开始确实是为了取代 c++,他们觉得 c++特性太多完全是 shit。但对 java、c#,特别是在基础设施这层造成冲击完全是出乎设计者的意料。
|
36
trait 2018-12-17 11:43:14 +08:00
@iwtbauh golang gc 系只可能跟 C# java 争市场,怎么可能跟 c/c++对比,google 重新定义系统语言概念,并不是所有人会认同
|
37
janxin 2018-12-17 11:50:05 +08:00 2
1. 做动态库比较麻烦还不好用,还不如单体应用,太大了就拆分走微服务间调用的模式
2. GOPATH 单个就行,走 go mod 或者 vendor 解决多版本间冲突问题;当然空间够用的话多个也不错 3. ... 4. systemd 是 Linux 下系统自带的进程守护方案,什么都不需要装,没什么不好的地方 |
38
trait 2018-12-17 11:50:33 +08:00
@rockyou12 完全不是取代 C++,当然 google 重新定义的“系统语言”环境下无可厚非,而是 Rob 亲口 go 方便大学毕业生,显然他们不信任这些新人的内存管理水平,把 C/C++的内存管理权限从菜鸟手中剥夺了,直接放到语言层面。没什么出乎意料的,带 gc 的“系统语言"确不能对内存作出精确管理压榨性能,去跟 gc 系抢饭吃是必然
|
39
lideshun123 2018-12-17 11:52:18 +08:00
@daigouspy .net 还有人用吗
|
40
keniusahdu 2018-12-17 12:12:38 +08:00
怎么这么多"插眼"的? v2 不是不让水么.
|
41
AlphaTr 2018-12-17 12:32:45 +08:00 1
1. Go 有 Plugin 机制,可以编译多个,也支持 -buildmode=shared 编译,但还是觉得编译为一个文件最方便;
2. Go 1.11 以上支持 go mod,开发上现在基本不用关心 gopath 了; 3. 编译的就是可执行文件,同样可以放在 PATH 目录内执行; 4. systemd 管理; |
42
CRVV 2018-12-17 13:01:46 +08:00
@trait
“不信任这些新人的内存管理水平” 1. 不是信任不信任的问题,而是手动管理内存要付出更多的开发成本,很多项目不乐意花这个钱 2. 你好像把内存管理想得太简单了。在某些情况下,即使是老人也一样管理不好内存,或者手动管理内存的运行时开销不比 GC 小 比如 https://software.intel.com/en-us/forums/intel-moderncode-for-parallel-architectures/topic/295279 |
43
Narcissu5 2018-12-17 13:17:17 +08:00
ahead of time 编译,java 的 graal 也可以做到。不过应该没有运行时优化,猜的哈
|
44
trait 2018-12-17 13:29:20 +08:00
@CRVV
1. 把新手与内存管理隔绝降低开发成本就是 go 做的,需要精确控制的场景 gc 省下的那点钱跟性能等优势比起来不值一提 2. 我从没把内存想简单,新手就是水平太差,没能力管理内存,所谓的老手真的是老手?至于你发那帖,读完主楼和回复并没发现 gc 在内存管理上有什么过人之处 |
45
dany813 2018-12-17 13:36:35 +08:00
插眼
|
46
ixiaohei 2018-12-17 13:42:04 +08:00
@iwtbauh 程序体积大占用内存就一定多么?系统都是分页的,实际占用内存很小的,很多都在 swap 上。另外内存相对于 cpu 真心便宜的;全部静态连接在一起,反而是 go 跨平台最大优势,没有依赖,那种裁剪的 linux,和嵌入式 arm 上直接拖过去就可以跑,爽的不要不要的。
|
47
limers 2018-12-17 13:42:15 +08:00 via Android
插眼
|
48
isCyan 2018-12-17 13:48:08 +08:00 via Android
可是 golang 内存占用还是很小
|
49
dacapoday 2018-12-17 13:52:05 +08:00
@iwtbauh #18 现实情况是内存和存储空间成本 远低于 部署成本,又不是嵌入式环境,可执行文件总比各种多媒体资源文件体积小吧。而现实中各种 库依赖 发行版依赖 版本不兼容,依然需要打包依赖配置依赖路径,搭建编译部署环境费时费力,而且相关知识不易传授培训给非开发人员,不然 docker 也不会火。
|
50
qieqie 2018-12-17 13:52:49 +08:00
可以链接 C 的 shared library,也可以 build,但不是主流,go 的主流库都是源代码 distribute 的。
cgo 交叉编译对熟悉 gcc/g++的其实也没有麻烦到哪里去。用 pkg-config 管理好依赖,就多一步 CGO_ENABLED=1 CC=... CXX=... 上面还有说体积 /内存的,源码依赖的 go build 只会编译可以被执行到的代码,而通过 cgo 链接二进制库的你同样可以使用-Wl,--gc-sections 这样的 linker flag。 |
51
Mrun 2018-12-17 14:08:13 +08:00
go 跨平台编译时优势
|
52
ptyfork 2018-12-17 14:49:50 +08:00
@heimeil
> 另外 Golang 不是不用装环境,而是环境都在编译的二进制文件里面了,你会发现 Go 编译出来的二进制比.NET 之类的大太多了。 你这比较的时候,.Net 还是要装环境啊, 不想装.net 环境,而是像 Go 一样把环境都打上,最后的安装包只会更大。 |
53
iamwh1temark 2018-12-17 14:56:02 +08:00
我感觉还好吧,有了 Docker 之后这个应该不算问题了.
|
54
yuikns 2018-12-17 15:01:53 +08:00
要求 disable cgo 才能不需要 runtime。
一般我输出 linux 然后丢 docker 里面。一个 image 几 M 到几十 M,特好用。 |
55
neoblackcap 2018-12-17 15:02:41 +08:00
@iwtbauh Google 内部用 golang 又不多,C++依然是他们的头号语言,紧接着是 Java,Golang 怎么样对他们又没有什么影响
|
56
iwtbauh 2018-12-17 15:31:28 +08:00 via Android
@ixiaohei #46
请注意看,我没说第 2 条和第 4 条有因果关系吧。(我没说是程序体积大导致内存占用大啊) 占用内存大是因为“重复的代码被多次载入主存”,因为如果我假设标准库 libgolang .so 文件(等)存在,那么 libgolang .so 只会载入主存一次,这就是操作系统的 cow 机制,即使系统中运行数个 golang 程序。然而因为静态编译,这部分代码只能重复载入主存。(而这一部分还不小) 换入磁盘在大部分情况下对于解决这个问题的意义不大(并不是说 swap 无用,只是对这种情况是用处不大的),因为这些程序执行 libgolang .so 中的代码(或访问数据)时,必须再从磁盘上重新换回到主存,这样只会导致系统缺页中断增多,拖慢系统性能。 另外,你也说了嵌入式系统,在嵌入式系统中更应该减少外存和主存的占用。 @dacapoday #49 注意看,我说的前提是“如果系统中大部分程序都是 golang ”。毕竟 golang 设计者差不多就是这样想的。原因见上。 |
57
iwtbauh 2018-12-17 15:36:47 +08:00 via Android
@neoblackcap #55
其实也不少,比如 dl.google.com 这个 主要是 Google 太富了,在硬件上使劲氪金,导致我等穷人非常难受。 chrome 内存泄漏因为内存大看不出来 chromium (还是 aosp ?) 的工具链直接丢进 git 里面简直疯了 |
58
kwanCCC 2018-12-17 15:37:48 +08:00
rpm
|
59
hlwjia 2018-12-17 15:41:37 +08:00 via iPhone 2
是只有我不知道“插眼”什么意思吗
|
60
pursuer 2018-12-17 15:47:21 +08:00
@iwtbauh 我个人觉得除了静态编译的内存消耗,动态加载目前也还不太行,plugin 一直不支持 windows,而且一共就实现了两个函数,Open 和 Lookup,用起来手感和 dlopen 和 dlsym 差不多,相比较我可能更喜欢 Windows COM 里 CoCreateInstance,QueryInterface 那套(但用 C++写会比较痛苦)或者 Java 的 ClassLoader 这样的
|
61
plqws 2018-12-17 15:53:52 +08:00
如果没有 分发单文件 binary / 无痛跨平台 这两个需求而去选 go 完全就是吃饱了撑着,所以那群需要动态链接的还是老老实实用其他语言吧
|
62
ixiaohei 2018-12-17 16:12:03 +08:00
@iwtbauh 静态链接讲的很有道理;另外嵌入式设备上令人烦躁的都是缺少依赖;特别是那种裁剪的嵌入式上,更令人头大;没有正常 linux 发行版有包管理工具...
|
64
neoblackcap 2018-12-17 16:48:49 +08:00
@iwtbauh 是的,因为这个是很久以前 Google 发文说的,不过除此以外我非常怀疑他们内部还有什么大系统是用 Golang 写的。就算现在吹那么多的容器编排,Borg 也还是用 C++写的。我对 Golang 在 Google 内部有很大的占比表示怀疑。
|
65
suley 2018-12-17 16:53:24 +08:00
@ixiaohei 如果经过剪裁的嵌入式,恐怕动态链接更需要了,毕竟静态链接编译出来的一般都比动态链接的大不少,嵌入式空间有限,捉襟见肘。
|
66
pathbox 2018-12-17 16:55:06 +08:00 via iPhone
go mac 下交叉编译放 centOS 上有 net 包的 bug 还是老老实实在 Linux 编译放生产
pm2 挺好用的。一般直接用于 go 项目 基本够用 一个 gopath。其他项目做软链接过去 |
68
0xCNSumi 2018-12-17 17:12:02 +08:00 3
@hlwjia 插眼来自于游戏英雄联盟(lol)中的放置控制守卫,放置后可以在一段时间或者永久的或者放置区域的视野,引申到收藏可以关注帖子的动态
|
70
dabaibai 2018-12-17 17:46:31 +08:00
相当方便好用
|
72
Muninn 2018-12-17 18:12:39 +08:00 2
我用了好几年 golang 了,应该能提供更好的答案,回答一下吧。
1. https://github.com/spf13/cobra 2. https://colobu.com/2018/08/27/learn-go-module/ 最新的 golang 不用了 3. 是 一般推荐用绝对路径,更一般的见 4 4. docker 研究一下不吃亏。golang 生态大多都用的容器,毕竟 docker 是 golang 的明星应用。 |
73
Muninn 2018-12-17 18:13:17 +08:00 5
补充,学 golang 别用 beego。会被带沟里。
web 框架的话推荐 gin 或者 echo |
74
wenzhoou 2018-12-17 18:37:18 +08:00 via Android
只有我喜欢静态编译吗。反正编译之后也不太大。(当然体积能缩小一下就更开心了) 确实用了 docker 就能感觉出来 golang 的好处了。
|
75
imherer OP @giuem
@wentaoliang @janxin @AlphaTr @Muninn 问下大佬,看了你们的回复然后今天用了下 go mod。 我发用 go mod 方式的话不管是 go run 还会 go build 很慢,会花很长时间。 我就只引入了 github.com/astaxie/beego 这个 直接在 GOPATH 下无论是 go run main.go 或者是 go build 很快( 1s 不到就完成了),但是用 go mod 的话初步估计至少 30s 以上 是什么原因呢?大佬们有遇到同样的情况吗? |
77
blless 2018-12-17 18:54:49 +08:00 via Android
动态链接多了就知道恶心了…不小心错一个版本直接系统都炸了,没有特殊需求我选择 go
|
78
imherer OP @janxin 我用 time go build -v 看了下过程,第一条信息就是 Fetching https://golang.org/x/crypto?go-get=1
这个没梯子肯定拉不了,但是我在 go.mod 里已经用 github 的源把它给 replace 掉了,为什么还要拉呢 发现就是这个一直卡到 timeout 然后就 build 成功了 |
79
jjx 2018-12-17 19:07:03 +08:00
python 装环境哪里有你们说的那么可怕
如果是 gfw 问题的, aliyun 有 pypi 镜像 虽然我也用 go, 但 python 环境装一次后面的更新很小, go 每次要传 10 多 m 的文件 关键如果用 cgo 等, 交叉编译还是用不了的 |
80
jjx 2018-12-17 19:07:54 +08:00
补充一下, go 传文件更新还要解决文件锁定问题, python 都可以直接覆盖
|
82
mmdsun 2018-12-17 19:31:06 +08:00 via Android
@lideshun123 . Net 用得少不过还是有人用的。微信支付清算网关,.net core。腾讯游戏平台,Service Fabric
|
83
janxin 2018-12-17 22:21:19 +08:00 via iPhone
@imherer 没有私有仓库我推荐使用 https://goproxy.io
|
85
icylord 2018-12-18 09:58:58 +08:00
golang 写的东西是不是没法闭源?
|
86
sammo 2018-12-18 10:11:32 +08:00
又怕炸
又想要动态链接 节省载入内存 被链接的库又无法保证每一个稳定的新版本可以向前兼容 又还幻想瞎链也不炸 你叫我很难办阿 |
87
Muninn 2018-12-18 10:25:06 +08:00
@imherer 网络问题 你如果有一个很快的梯子的话,就不是问题了。
因为用了 go mod 后,每次 test 或者 build 都会检查一遍依赖。gopath 模式下不会联网。 而且你需要弄成 http proxy 才能对命令行起作用。 用 vscode 的话,也要在 http proxy 在环境变量时的终端里用 code 命令启动 vscode 或者在 vscode 里配置梯子。 |
88
xrlin 2018-12-18 10:57:25 +08:00
跨平台交叉编译+单文件部署是我最青睐 golang 的一点,自己写点小项目部署很方便,资源占用还小,还有因为没有各种特性,浏览器装上 sourcegraph 就可以像 ide 一样浏览代码。
|
89
realpg 2018-12-18 10:59:45 +08:00
@BXIA #8
就是静态链接 最常见的类似东西就是 windows 的程序大量采用静态链接,就算动态链接也把一系列动态链接库放到自己目录下自己独占避免系统里面包含的版本不对问题 linux 系则是大部分依赖系统内的公用库,造成了直接拷二进制各种跨机器都费劲的问题,内核版本,各种库版本的不一致 |
90
imherer OP @Muninn 嗯,是的。我只是奇怪我在 go.mod 里已经把源 replace 到 GitHub 上的源了,为什么还会去拉取。
不过用了 janxin 给的方法直接改 GOPROXY 更简单 |
91
RqPS6rhmP3Nyn3Tm 2018-12-18 11:44:08 +08:00 via iPhone
@realpg 我知道他是静态链接,但是如此方便跨架构编译给我造成了巨大的冲击
交叉编译个稍微大点的 C 项目就很让我绝望了(依赖问题太麻烦,就算静态链接还是很痛苦),go 在这方面上是真的牛逼 |