golang有什麼致命的問題嗎?
要做一個門戶網站,後端使用go語言,想知道會不會有什麼比較嚴重的問題
Go本身的致命問題不敢說,說一些可能導致業務致命的問題。
- 淺拷貝: slice, map等賦值操作都是淺拷貝,並未實現clone,很容易線上bug。 深層次來說,這不僅容易誤用,而且給GC也帶來了巨大的壓力,還可能導致循環引用等問題。
type S struct {
A string
B []string
}
func main() {
x := S{"x-A", []string{"x-B"}}
y := x // copy the struct
y.A = "y-A"
y.B[0] = "y-B"
fmt.Println(x, y)
// Outputs "{x-A [y-B]} {y-A [y-B]}" -- x 被修改
}
2. Append的黑魔法。通過Append修改slice,在cap不夠的時候,會出現類似"Copy On Write"的奇效。 例子來自參考1.
func doStuff(value []string) {
fmt.Printf("value=%v
", value)
value2 := value[:]
value2 = append(value2, "b")
fmt.Printf("value=%v, value2=%v
", value, value2)
value2[0] = "z"
fmt.Printf("value=%v, value2=%v
", value, value2)
}
func main() {
slice1 := []string{"a"} // length 1, capacity 1
doStuff(slice1)
// Output:
// value=[a] -- ok
// value=[a], value2=[a b] -- ok: value unchanged, value2 updated
// value=[a], value2=[z b] -- ok: value unchanged, value2 updated
slice10 := make([]string, 1, 10) // length 1, capacity 10
slice10[0] = "a"
doStuff(slice10)
// Output:
// value=[a] -- ok
// value=[a], value2=[a b] -- ok: value unchanged, value2 updated
// value=[z], value2=[z b] -- WTF?!? value changed???
}
3. 空指針nil/除0問題想必困擾了大家不少,稍不留意就Panic。更現代的語言會參考代數類型(參考4)來避免類型設計上的缺失。 例如Rust採用Option&代替T完成相關類型的常規計算,從邏輯層面控制消除可能存在的漏洞。
4. 錯誤處理,重複代碼太高。例子看參考2, 但是從https://github.com/golang/go/issues/32437來看, Golang將引入對應的try語法。
5. 還是重複代碼多,首字母大寫,導致使用反射來序列化struct成json格式的時候,struct tags 99%的概率要手寫。例如:
type User struct {
Id string `json:"id"`
Email string `json:"email"`
Name string `json:"name,omitempty"`
}
最後推薦一個flaws set: https://github.com/ksimka/go-is-not-good
有時間再慢慢補充。
updating:
刪除第三條,本來是想說對介面的支持太弱。 實際上Go1.14已經支持overlapping interface了,算是前進一步了。
參考:
- https://bluxte.net/musings/2018/04/10/go-good-bad-ugly/
- http://tyoverby.com/posts/rust-vs-go.html
- http://yager.io/programming/go.html
- https://www.zhihu.com/question/24460419
問題就是會有一大堆其他語言經驗的人過來噴, go不符合在他們社區的實踐之類的
謝邀,go寫網站後端沒有任何問題,輕輕鬆鬆的事情!
做網站沒啥問題
推薦閱讀: