引數太靈活容易出錯
(金慶的專欄 2020.7)
golang中可以將引數型別設為 inte***ce{}, 這樣就可以傳入任意型別的引數,
和 c++ 中 void* 的作用相似。
但是這種萬能型別應該盡量少用,盡量使用具體的型別,或者使用乙個具體的介面型別。
主要的原因是, 讓編譯期的型別檢查擋住編碼錯誤,減少執行期的錯誤。
例如,go-mongo-driver 有個建立索引的引數:
type indexmodel struct
...}
其中 keys 可以是任意型別,如 1234, 「abcd」, 當然不符合索引要求的型別會返回失敗。
但是 bson.m 型別,會建立索引成功,但是索引的次序會有錯誤。
注釋中已指出,不要用 bson.m, 應該使用 bson.d.
正確的 keys 如下,表示復合索引 (field1, field2),1表示正序,-1則反序:
indexmodel.keys := bson.d, }
如果使用 bson.m, 實際上是個 map:
indexmodel.keys := bson.m
因為 map 成員的次序不定,最後建立的索引可能是 (field1, field2),也可能是 (field2, field1)。
此處型別允許 inte***ce{} 的想法是,允許任意型別,會 bson 編碼後傳給 mongo 伺服器,並不會進行型別檢查。
這種靈活性非常容易造成錯誤,並且如何使用也不明確, 僅靠注釋作用很小。
python 太靈活 Python中的靈活引數
別這樣!但如果你還想,我建議你有乙個中間類或函式來處理這個問題 偽 def printthenumber num print num def intermediateprintthenumber input num int dict 或者,在更糟的情況下,one 甚至可能更糟 這應該由乙個只負責處理...
容易出錯的 if 語句
下面列舉幾個容易出錯的if語句例項,如果後續還有新的發現,還會繼續更新!int n 5 if n 0 printf 值為正 初次執行,感覺一切正常,沒有錯誤,這時我把n的值改為 5重新編譯後,結果還是為正。這是為什麼?仔細一瞧,我們發現在 n 0 後面我們多加了個分號!原因 只有乙個分號的語句叫做空...
C 容易出錯的點
1 c風格字串的兩種形式 1 char a 手動新增結束符 0 2 char a abv 預設新增 0 2 sizeof 返回的值表示的含義如下 單位位元組 陣列 編譯時分配的陣列空間大小 指標 儲存該指標所用的空間大小 儲存該指標的位址的長度,是長整型,應該為4 型別 該型別所佔的空間大小 物件 ...