3 回答

TA貢獻1864條經驗 獲得超6個贊
需要明確的一些事情:Java 和 Go 都以相同的方式從文件中讀取數據。
文件是按 8 位分組的一系列二進制數據,我們稱之為字節。這個字節是 8 位,你如何解釋它完全取決于你。
Go 和 Java 都將讀取相同的 8 位組,但 Java 會將其存儲在byte有符號類型的 Java類型中,而 Go 會將其存儲在無符號的 Gobyte類型中。但是兩者都將具有相同的 8 位,讀取的數據將相等:
var b byte = 248
var i int8 = -8
fmt.Printf("%x %x\n", b, byte(i))
輸出:
f8 f8
如果您需要將讀取的 8 位解釋為有符號值,只需使用類型轉換:
data := []byte{8, 248, 198}
for _, v := range data {
fmt.Println(int8(v))
}
輸出(與 Java 輸出相同):
8|-8|-58|
試試Go Playground上的示例。
您是否應該擔心性能(因為類型轉換)?絕對不。byte->int8轉換沒有運行時成本,因為兩者具有相同的內存布局(即 8 位 = 1 字節),并且轉換只是告訴以不同的方式解釋這 8 位。

TA貢獻1876條經驗 獲得超5個贊
unsafe.Pointer如果您確切知道自己在做什么,則可以使用。因為顧名思義,它是不安全的。因此,如果您不明智地使用它,它會爆炸。
package main
import (
"fmt"
"unsafe"
)
func main() {
unsigned := make([]uint8, 0)
unsigned = append(unsigned, 128)
unsigned = append(unsigned, 255)
signed := *(*[]int8)(unsafe.Pointer(&unsigned))
fmt.Printf("%d : %d\n", signed[0], unsigned[0])
fmt.Printf("%d : %d\n", signed[1], unsigned[1])
}
// -128 : 128
// -1 : 255
你可以在Go 操場上找到這個例子

TA貢獻1735條經驗 獲得超5個贊
上面的不安全答案非常好,但是它不適用于appengine。
這是安全版本:
signed := make([]int8, len(unsigned))
for i, v := range unsigned {
signed[i] = int8(v)
}
- 3 回答
- 0 關注
- 350 瀏覽
添加回答
舉報