2 回答

TA貢獻2036條經驗 獲得超8個贊
Javascript 中的整數是 32 位的,而 Go 的整數取決于體系結構,可能是 32 位和 64 位。它是 Go 游樂場上的 64 位。由于每次迭代向左移動 5,因此使用超過 6 個字符肯定會在 Javascript 中“溢出”(但在 Go 中尚未溢出):。int7*5=35 > 32 bits
使用顯式 32 位整數 () 來獲得與 Javascript 中相同的輸出:int32
func CountChars(char string) int32 {
var sum int32 = 0
if char == "" {
return sum
}
for x := 0; x < len(char); x++ {
sum = (sum << 5) - sum + int32(char[x])
sum &= sum
}
return sum
}
這種方式的輸出將與Javascript的輸出相同(在Go游樂場上嘗試):
2138589785
1871773944
另請注意,Go 將字符串存儲為內存中的 UTF-8 字節序列,并為字符串(如 )編制索引,即 UTF-8 序列。這在您的示例中很好,因為所有輸入字符都使用單個字節進行編碼,但如果輸入包含多字節字符,您將獲得不同的結果。char[x]
要正確處理所有情況,請使用一個簡單的字符串:返回連續的符文,該符文也是 的別名,因此您可以獲得所需的代碼點。for rangeint32
此外,檢查空字符串是不必要的,如果它是空的,則不會執行循環主體。另外:這是一個沒有操作,只需刪除它。sum &= sum
簡化版本:
func CountChars(s string) (sum int32) {
for _, r := range s {
sum = (sum << 5) - sum + r
}
return
}
測試它:
fmt.Println(CountChars("Google 世界"))
將輸出與Javascript中相同的輸出(在Go游樂場上嘗試這個):
-815903459

TA貢獻1906條經驗 獲得超3個贊
這是一個大小問題。JS 整數是 32 位,而 Go 整數不一定是 32 位。如果依賴于特定的 int 大小,則應通過將 的實例替換為 來指定它。intint32
那是什么樣子的(游樂場):
package main
import (
"fmt"
)
func main() {
fmt.Println(CountChars("Google"))
fmt.Println(CountChars("Google1"))
}
func CharCodeAt(s string, n int) int32 {
return int32(s[n])
}
func CountChars(char string) int32 {
var sum int32 = 0
if char == "" {
return sum
}
for x:=0; x<len(char); x++ {
sum = (sum << 5) - sum + CharCodeAt(char, x)
sum &= sum
}
return sum
}
- 2 回答
- 0 關注
- 99 瀏覽
添加回答
舉報