Go 的几大坑

2018-09-30 14:19:21 +08:00
 hijoker
可能有些不准确,别跟我说用了 N 多的 trick 怎么实现了,我说的是开箱即用
1. 接口没有默认实现, 几个数据结构实现了某个接口需要有统一的行为,每个都得写一个几乎同样的方法,太蛋疼了
2. panic 的堆栈信息,捕获是捕获了,我要把他打到日志里去??
3. 日志框架,默认能做到打印行号,打印时间,打印级别,控制按日志级别输出,对日志自动分片压缩的几乎没有
4. 蛋疼的类型信息
6293 次点击
所在节点    Go 编程语言
48 条回复
hijoker
2018-09-30 17:15:58 +08:00
@darrh00 我觉得根据日志级别控制输出是很常用的功能。。。。
还有 logrotate 这个,真心在 windows 上就不好搞了
aliipay
2018-09-30 17:16:49 +08:00
@Aruforce 我都是跟这感觉写的,都不管指针不指针的
hijoker
2018-09-30 17:18:50 +08:00
@xkeyideal 你看懂了么,interface 的默认实现??
就是说几个
type struct1 struct{...}
type struct2 struct{...}
都实现了某个接口,这个接口其实对于大家都是一样的,如果有个默认实现就好了,不用每个 struct 都去写同样的方法,除了 receiver 不一样之外
hijoker
2018-09-30 17:19:17 +08:00
@lideshun123 请指教
hijoker
2018-09-30 17:19:49 +08:00
@jitongxi 我玩了几天也这就遇到了这些问题,实在惭愧
silov
2018-09-30 17:20:54 +08:00
Golang 新手签到,刚刚遇到一个小坑。。。时间格式化的 Fomat、Parse 方法的格式参数。。。。竟然是那种写死的字符串。。。真是写的时候就透露着一股尴尬。。。

```golang
datetime := time.Now().Format("2006-01-02 15:04:05") //后面的参数是固定的 否则将无法正常输出
```
hijoker
2018-09-30 17:21:06 +08:00
@zwpaper 我也是这样想的,感觉 Go 社区走的路子怪怪的
janxin
2018-09-30 17:22:09 +08:00
@hijoker 如果是这样你试试 embed struct ?
xkeyideal
2018-09-30 17:22:24 +08:00
@Aruforce 你这个完全是 go 好心办坏事,go 怕一些不懂或者不完全懂指针的用户指针的用法不对,造成一些他们意向不到的问题,所以将你说的这些情况都给兼容了。如果是玩过 C/C++的,根本不会有这种疑问,指针和形参还是很好区分的,另建议使用指针操作。
go 里面玩指针就按照 C/C++那套整就完全没问题,注意一下 map, slice 默认是引用传递( go 官方不承认用“引用传递”这个说法)
xkeyideal
2018-09-30 17:24:32 +08:00
@silov 对于操作时间,给你个建议,任何时候都带上时区去计算,否则对时间强依赖的项目,死都不知道怎么死的,运维给你服务器整个 UTC 时区,你按照北京时间算
lwldcr
2018-09-30 17:25:06 +08:00
log 确实没有像 java log4j 那种功能齐备的库
不过我自己用的时候标准库的 log 上自定义部分功能+logrotate 基本满足需求了
hijoker
2018-09-30 17:26:04 +08:00
@janxin 是个办法,谢谢,
xkeyideal
2018-09-30 17:28:40 +08:00
@hijoker 所以说你是第一天玩呢!!
你在 struct1 和 struct2 上都”继承“一个基类 struct3,然后让 struct3 去实现你想要的同一样且不需要写两次的接口不就行了么?

想玩面向对象编程那套,go 并不是不是可以,只不过现有的基础设施比较简陋,实现的面向对象不能像 C++和 Java 那么简便和高大上罢了

多看看一些开源项目对深入提升比较有好处
silov
2018-09-30 17:31:21 +08:00
@xkeyideal 感谢提醒,我看下
darrh00
2018-09-30 17:40:11 +08:00
@hijoker

光要控制日志输出,很容易, 错误信息 info 输出,调试信息 debug 输出,加一个控制开关关闭 debug 输出
分那么多 info,warn,error,fatal 就是脱裤子放*, 你真的会用那么多级别来控制程序的日志输出?
交给运维人员,运维人员会用你那么多的参数设置?

windows 这个真不懂了,没有在 windows 上跑服务程序的经验。
whoami9894
2018-09-30 17:47:21 +08:00
哈哈我也来说一个坑:
结构体是值类型,切片是引用类型
我把一个结构体传入函数(不传指针),函数里修改结构体内容(比如 append 结构体替换原有结构体只全局可见)。如果直接修改结构体里的切片则是全局可见
RaynorGu
2018-09-30 17:49:07 +08:00
@darrh00 debug, info, warning, error 这四个级别还是要的,debug 是调试的时候打印信息,info 是线上一些做事情的日志,比如定时器啊之类的,这样查问题可以看到有没有做,warning 就是一些不是很重要的错误,error 就是重要的错误
whoami9894
2018-09-30 17:50:21 +08:00
@whoami9894
append 结构体替换原有结构体只局部可见
jinzhe
2018-09-30 18:06:03 +08:00
@silov 自己写个辅助函数转一下即可
```go

// Format time.Time struct to string
// MM - month - 01
// M - month - 1, single bit
// DD - day - 02
// D - day 2
// YYYY - year - 2006
// YY - year - 06
// HH - 24 hours - 03
// H - 24 hours - 3
// hh - 12 hours - 03
// h - 12 hours - 3
// mm - minute - 04
// m - minute - 4
// ss - second - 05
// s - second = 5
func FormatDate(format string, t ...time.Time) string {
var datetime time.Time
if len(t) == 0 {
datetime = time.Now()
} else {
datetime = t[0]
}

res := strings.Replace(format, "MM", datetime.Format("01"), -1)
res = strings.Replace(res, "M", datetime.Format("1"), -1)
res = strings.Replace(res, "DD", datetime.Format("02"), -1)
res = strings.Replace(res, "D", datetime.Format("2"), -1)
res = strings.Replace(res, "YYYY", datetime.Format("2006"), -1)
res = strings.Replace(res, "YY", datetime.Format("06"), -1)
res = strings.Replace(res, "HH", fmt.Sprintf("%02d", datetime.Hour()), -1)
res = strings.Replace(res, "H", fmt.Sprintf("%d", datetime.Hour()), -1)
res = strings.Replace(res, "hh", datetime.Format("03"), -1)
res = strings.Replace(res, "h", datetime.Format("3"), -1)
res = strings.Replace(res, "mm", datetime.Format("04"), -1)
res = strings.Replace(res, "m", datetime.Format("4"), -1)
res = strings.Replace(res, "ss", datetime.Format("05"), -1)
res = strings.Replace(res, "s", datetime.Format("5"), -1)
return res
}```
bobuick
2018-09-30 18:26:40 +08:00
日志是你没用对库吧。std 里日志没有那么完整的支持,这种一般都不会在 std 里,c++, java 也是这样。

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

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

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

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

© 2021 V2EX