我正在嘗試撰寫一個程式來將二進制檔案讀入golang中的結構,方法是使用二進制包讀取二進制檔案來填充包含陣列的結構,我使用的是陣列而不是切片,因為我想指定欄位長度,這似乎作業正常但是當我嘗試使用反射來列印我們的欄位值時,我收到了這個錯誤
恐慌:反映:對陣列值呼叫反射.Value.Bytes
這是代碼
package main
import (
"encoding/binary"
"fmt"
"log"
"os"
"reflect"
)
type SomeStruct struct {
Field1 [4]byte
Field2 [2]byte
Field3 [1]byte
}
func main() {
f, err := os.Open("/Users/user/Downloads/file.bin")
if err != nil {
log.Fatalln(err)
}
defer f.Close()
s := SomeStruct{}
err = binary.Read(f, binary.LittleEndian, &s)
numOfFields := reflect.TypeOf(s).NumField()
ps := reflect.ValueOf(&s).Elem()
for i := 0; i < numOfFields; i {
value := ps.Field(i).Bytes()
for j := 0; j < len(value); j {
fmt.Print(value[j])
}
}
}
當我將代碼更改為此
package main
import (
"encoding/binary"
"fmt"
"log"
"os"
"reflect"
)
type SomeStruct struct {
Field1 [4]byte
Field2 [2]byte
Field3 [1]byte
}
func main() {
f, err := os.Open("/Users/user/Downloads/file.bin")
if err != nil {
log.Fatalln(err)
}
defer f.Close()
s := SomeStruct{}
err = binary.Read(f, binary.LittleEndian, &s)
numOfFields := reflect.TypeOf(s).NumField()
ps := reflect.ValueOf(&s).Elem()
for i := 0; i < numOfFields; i {
value := ps.Field(i)
fmt.Print(value)
}
}
它用它們的 ascii 表示列印陣列,我需要列印 ascii 的 char 表示,當我感到恐慌時
想法?
uj5u.com熱心網友回復:
位元組檔案說:
位元組回傳 v 的基礎值。如果 v 的基礎值不是位元組切片,它會恐慌。
對陣列進行切片以獲得位元組切片:
field := ps.Field(i)
value := field.Slice(0, field.Len()).Bytes()
for j := 0; j < len(value); j {
fmt.Print(value[j])
}
您還可以遍歷陣列:
value := ps.Field(i)
for j := 0; j < value.Len(); j {
fmt.Print(byte(value.Index(j).Uint()))
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/453003.html
上一篇:Go-型別轉換與型別轉換
