【解决一个小问题】golang 的 `-race`选项导致 unsafe代码 panic ...

打印 上一主题 下一主题

主题 880|帖子 880|积分 2640

作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!
为了提升性能,使用 unsafe 代码来重构了凯撒加密的代码。代码如下:
  1. const (
  2.         lowerCaseAlphabet = "abcdefghijklmnopqrstuvwxyz"
  3.         upperCaseAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
  4. )
  5. var (
  6.         lowerCaseAlphabetArr     = []byte(lowerCaseAlphabet)
  7.         upperCaseAlphabetArr     = []byte(upperCaseAlphabet)
  8.         tableOflowerCaseAlphabet = unsafe.Pointer(&lowerCaseAlphabetArr[0])
  9.         tableOfupperCaseAlphabe  = unsafe.Pointer(&upperCaseAlphabetArr[0])
  10. )
  11. // CaesarFastEncode fast version
  12. func CaesarFastEncode(in []byte, out []byte, rot int) {
  13.         start := unsafe.Pointer(&in[0])
  14.         target := unsafe.Pointer(&out[0])
  15.         for i := 0; i < len(in); i++ {
  16.                 c := *((*byte)(start))
  17.                 if c == '.' {
  18.                         *((*byte)(target)) = '='
  19.                 } else if c >= 'a' && c <= 'z' {
  20.                         idx := (int(26+(c-'a')) + rot) % 26
  21.                         *((*byte)(target)) = *((*byte)(unsafe.Pointer(uintptr(tableOflowerCaseAlphabet) + uintptr(idx))))
  22.                 } else if c >= 'A' && c <= 'Z' {
  23.                         idx := (int(26+(c-'A')) + rot) % 26
  24.                         *((*byte)(target)) = *((*byte)(unsafe.Pointer(uintptr(tableOfupperCaseAlphabe) + uintptr(idx))))
  25.                 } else {
  26.                         *((*byte)(target)) = *((*byte)(start))
  27.                 }
  28.                 start = unsafe.Pointer(uintptr(start) + uintptr(1))
  29.                 target = unsafe.Pointer(uintptr(target) + uintptr(1))
  30.         }
  31. }
复制代码
由此看来,只要使用了 unsafe 代码,都应该加上-race选项。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表