首頁  >  文章  >  後端開發  >  使用反射將位元組複製到結構體字段中

使用反射將位元組複製到結構體字段中

WBOY
WBOY轉載
2024-02-09 09:00:35479瀏覽

使用反射將位元組複製到結構體字段中

php小編草莓介紹:在程式設計中,有時候我們需要將位元組資料複製到結構體的欄位中。這個過程可以透過使用反射來實現。反射是一種強大的工具,可以在運行時檢查和操作程式碼結構。透過反射,我們可以獲取結構體的字段信息,並將位元組數據按照字段的類型和順序複製到結構體中,實現數據的轉換和賦值。這種方法可以為我們帶來便利性和靈活性,使得我們能夠更有效率地處理位元組資料。

問題內容

如何迭代位元組切片並將它們指派給結構體的欄位?

type s struct {
  f1 []byte
  f2 []byte
  f3 []byte
}

func S s {
  x := s{}
  x.f1 = make([]byte, 4)
  x.f1 = make([]byte, 2)
  x.f1 = make([]byte, 2)
  return x
}

func main() {
  data := []byte{83, 117, 110, 83, 0, 1, 0, 65}

  Z := S()
  //pesudo code from here
  i:= 0
  for field in Z {
    field = data[i:len(field)]
    i += len(field)
  }

期望:

  • f1 = [83,117,110,83]
  • f2 = [0,1]
  • f3 = [0,65]

我以前在 c/c 中做過這個,但我不知道如何在 go 中做到這一點。我需要通用的分配函數,因為我將有幾個不同的結構,其中一些結構可能不存在於流中。

理想情況下,我想傳遞初始化的結構,並且我的程式碼將迭代填充它們的結構欄位。

解決方法

利用二進位/編碼包中的反射程式碼。

第 1 步:將欄位宣告為陣列而不是切片。

type s struct {
  f1 [4]byte
  f2 [2]byte
  f3 [2]byte
}

第 2 步:使用 binary.read 將資料解碼為結構體 p>

var s s
data := []byte{83, 117, 110, 83, 0, 1, 0, 65}
err := binary.read(bytes.newreader(data), binary.littleendian, &s)
if err != nil {
    log.fatal(err)
}

第三步:完成!

fmt.Print(s) // prints {[83 117 110 83] [0 1] [0 65]}

https://www.php.cn/link/42ae1544956fbe6e09242e6cd752444c

以上是使用反射將位元組複製到結構體字段中的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除