V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  jiac  ›  全部回复第 1 页 / 共 1 页
回复总数  1
324 天前
回复了 Richard14 创建的主题 Go 编程语言 Go 语言学习中遇到的问题
语言设计
1. Go 在编译期用逃逸分析确定一个对象应该分配在堆上还是栈上,和是否用 new 创建无关,在栈上创建的对象函数退出即销毁,堆上垃圾回收负责销毁。PS Go 的大多数小对象都是在栈上直接销毁的,不需要垃圾回收,这也是 Go GC 不使用分代回收的设计原因。
2. 不是万物皆对象。
3. defer 和 Python 中 with 关键词类似,Go 没有上下文管理工具。PS 我自己总结 Go 的一个设计原则是“没有魔法”,其他语言中非直观的语法糖在 Go 中几乎都不存在。
4. channel 这块还没看,channel 是 Go 为了 CSP 编程模式提供的组建,使用 channel 不是是否廉价操作的问题,是性能开销可接受的情况下,如何选择设计模式的问题。
5. channel 代表着 "share memory by communicating" 的编程思想,锁一类的内存共享代表着 "communicate by sharing memory",两者只是解决方案的不同,不同场景各有优劣,编程语言和思想没有哪个更优越之分。
6. 不会,Go 帮你做好了优化。
7. 没有 Rust 和 C / C++ 那么接近,比 Java 接近,数组指针操作允许,用官方提供的 unsafe 包就可以做到,从包的名字就可以知道可靠程度完全依赖程序员,Go 自身不做保证。
8. 我觉得和其他语言的闭包概念没区别。
9. 不清楚。
10. 相对于其他语言,不是,在具体场景下 select 是否昂贵就需要具体分析,go 在编译期间会把 AST 中的 select 节点视使用方法替换成不同的 runtime 方法,各自方法有不同的优化策略。
11. 强类型,返回 int 不能返回 nil ,你可以自己试一下。
12. 前面我分享了自己总结 Go 的一个设计原则是“没有魔法”,panic 这种非直观语法其实生产中很少用,如果使用 Go ,返回错误请直接返回 error 类型,而不是依赖 panic 和 recover 。

多线程
1. sync.Mutex 会在不同的情况下自己决定是否自旋,如果你需要手工自旋检查某条件,建议使用 sync.Cond
2. 可以使用 channel 把对 map 的并发操作变为顺序操作,即多个 goroutines 把操作发到 channel 里,一个 goroutine 消费这个 channel 来操作 map ; Go 官方应该会推荐你使用 `sync.Map`。

最佳实践
1. 不要去调查,用接口来双方约定。
2. Go 自身提供了 benchmark 功能,自己去学吧。
3. 不要使用 interface{},除非万不得已,业务代码不会出现这个情况。
4. map[K]struct{} 就是 set ,deque 自己用 channel 或者 slice 封一个吧,list 没有官方实现,欢迎其他朋友补充最佳实践。
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2920 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 13ms · UTC 11:17 · PVG 19:17 · LAX 04:17 · JFK 07:17
Developed with CodeLauncher
♥ Do have faith in what you're doing.