Go 的几大坑

2018-09-30 14:19:21 +08:00
 hijoker
可能有些不准确,别跟我说用了 N 多的 trick 怎么实现了,我说的是开箱即用
1. 接口没有默认实现, 几个数据结构实现了某个接口需要有统一的行为,每个都得写一个几乎同样的方法,太蛋疼了
2. panic 的堆栈信息,捕获是捕获了,我要把他打到日志里去??
3. 日志框架,默认能做到打印行号,打印时间,打印级别,控制按日志级别输出,对日志自动分片压缩的几乎没有
4. 蛋疼的类型信息
6112 次点击
所在节点    Go 编程语言
48 条回复
hijoker
2018-09-30 14:44:13 +08:00
panic 的堆栈信息可以如下做
defer func() {
if r := recover(); r != nil {
logUtil.Error.Printf("panic, %s, collecing ends", fmt.Sprintf("%v",r))
return
}
}()
Mohanson
2018-09-30 14:52:19 +08:00
现在日志很少会靠程序自动写了, 都是程序打印到标准输出, 然后 supervisor 或 heka 等服务捕获, 并做日志分割, 存储等功能.
heimeil
2018-09-30 15:03:19 +08:00
1. 你可以考虑一下把接口拆分得颗粒度小一点,再组合合适的功能到一起
2. 最好做到 no panic,做好错误检查比 defer recover 好得多
hijoker
2018-09-30 15:48:56 +08:00
@Mohanson 并不是每个都搞这些高大上的
Immortal
2018-09-30 15:59:34 +08:00
对日志自动分片压缩的几乎没有
这个倒是真的 得自己实现了
xkeyideal
2018-09-30 16:04:57 +08:00
1 -> 对语言了解不深,既然是 interface,自己不实现,难道用意念编程?
2 -> panic 对应的还有个叫 recover, 参考一楼的答案,学艺不精
3 -> 日志框架,你别告诉大家说你用标准库的,现在都用第三方或自己写,有个叫 logrus 的据说挺好用
4 -> 类型信息缺失挺蛋疼,还不支持 int,int32 这些类型的自动转义,这个算个槽点

楼主应该是刚入门的级别,建议多修炼修炼,吐槽的都没到点上

你应该吐槽:
1. 为毛没有泛型?
2. 从来没见过这么垃圾的包管理?
3. 什么玩意,写个项目还要定义 gopath 这个环境变量?
4. error 处理这他妈垃圾!!!
5. 为毛编译这么快,老子都没反应过来,c++不是 make 一下可以玩一把手游的么
bonfy
2018-09-30 16:09:47 +08:00
包管理是可以吐槽

error 处理写多了,倒是没有感觉了,至少好处是每个 error 都处理,问题比以前写 Python 少多了
tourist2018
2018-09-30 16:17:07 +08:00
日志框架,默认能做到打印行号,打印时间,打印级别,控制按日志级别输出,对日志自动分片压缩的几乎没有

这个一般是第三方实现的吧 而且 go 的 log 能提供的东西已经很多了
zwpaper
2018-09-30 16:21:05 +08:00
@xkeyideal #6 日志框架也真的是 槽点,logrus 的 issue 好几年了,行号的功能楞是没加上
feiyuanqiu
2018-09-30 16:22:00 +08:00
感觉最近 go 代替了 php,成为了最引战语言...是不是说明 go 最近发展势头还不错?
hcymk2
2018-09-30 16:23:43 +08:00
golang 中根据首字母的大小写来确定可以访问的权限
当初没看文档,被这个坑的不要不要的。
xkeyideal
2018-09-30 16:32:22 +08:00
@zwpaper 打印行号,打印时间,打印级别,控制按日志级别输出,对日志自动分片压缩,打印调用的堆栈信息,按照执行完整流程作用域输出等等,这些功能好像并不难实现,所以自己写个就好啦,想要啥功能自己加,还能为项目需要个性化定制
lideshun123
2018-09-30 16:35:31 +08:00
学艺不精也来喷,你看 V2 多友善
zarte
2018-09-30 16:58:47 +08:00
map slice 默认传引用这个比较坑。
janxin
2018-09-30 17:00:34 +08:00
1 无解,换个语言可破;
2 是用法你没了解;
3 这个库有的,你再找找?不过这样程序会慢,个人建议性能敏感程序不要打印文件行号信息;
4. 换个 Rust 试试?
Aruforce
2018-09-30 17:01:44 +08:00
我想吐槽的是 p1 *P =&P{}和 p2 *P=P{}。。居然都尼玛可以。。。还有接受指针压栈的函数。。在写代码的时候 p3 P =P{}。。p3 也能直接调用。。。
综上 。。所写非所得。。。 每次写代码前都要先想下 p 到底是不是指针。。。也许是我写的太少的原因。。。
其他的泛型。。。error 处理方式。。包管理。。。还没有 ThreadLocalStorage。。其他什么的就不 BB 了。。。
jitongxi
2018-09-30 17:04:16 +08:00
楼主玩 go 一两天的经验。。。
janxin
2018-09-30 17:07:08 +08:00
@Aruforce 我想要 ThreadContext 啊,一个 ctx 显示传来传去非常蛋疼。

没 get 到第一个问题是什么问题,编译不过的吧?能否给个代码看看?另外那个真的不是传统意义上的“指针”...
darrh00
2018-09-30 17:08:50 +08:00
打印行号: 默认有

打印时间 : 默认有

打印级别,控制按日志级别输出: 关于这个非常同意 Dave cheney 的观点,完全没必要分很细的日志界别 [链接]!( https://dave.cheney.net/2015/11/05/lets-talk-about-logging)

日志自动分片压缩: logrotate 写个几行配置,然后程序里响应一下 SIGHUP 信号,重新开一下日志文件,搞定。
zwpaper
2018-09-30 17:15:08 +08:00
@xkeyideal 自己写一个是一方面,我现在确实是改的 logrus,但是有一个好的库,还是会更好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/494161

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX