要做一個門戶網站,後端使用go語言,想知道會不會有什麼比較嚴重的問題



Go本身的致命問題不敢說,說一些可能導致業務致命的問題。

  1. 淺拷貝: 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了,算是前進一步了。

參考:

  1. https://bluxte.net/musings/2018/04/10/go-good-bad-ugly/
  2. http://tyoverby.com/posts/rust-vs-go.html
  3. http://yager.io/programming/go.html
  4. https://www.zhihu.com/question/24460419


問題就是會有一大堆其他語言經驗的人過來噴, go不符合在他們社區的實踐之類的


謝邀,go寫網站後端沒有任何問題,輕輕鬆鬆的事情!


做網站沒啥問題


推薦閱讀:
相關文章