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 关注
- 103 浏览
添加回答
举报