首頁 > 後端開發 > Golang > 如何使用未匯出的結構和類型轉換來解決 Go 的 JSON 標籤限制?

如何使用未匯出的結構和類型轉換來解決 Go 的 JSON 標籤限制?

Linda Hamilton
發布: 2024-12-30 10:34:10
原創
327 人瀏覽過

How Can I Work Around Go's JSON Tag Restrictions Using Unexported Structs and Type Casting?

在未匯出的結構中使用型別轉換

在Go 中,您無法為結構中的相同欄位定義多個JSON 標記。但是,有一種解決方法,可以在未導出的結構之間使用強制轉換。

首先,使用不同的JSON 標籤建立兩個結構相同的結構,如您的範例所示:

type Foo struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

type Bar struct {
    Name string `json:"employee_name"`
    // Age omitted with backtick syntax
    Age  int    `json:"-"`
}
登入後複製

現在,讓Bar 不導出其名稱以小寫字母開頭:

type bar struct {
    Name string `json:"employee_name"`
    Age  int    `json:"-"`
}
登入後複製

要從Foo 轉換為bar,請轉換Foo到*欄,如下所示:

f := Foo{Name: "Sam", Age: 20}
b := (*bar)(unsafe.Pointer(&f))

// b now has the modified JSON tags
登入後複製

注意事項:

  • 此技術應謹慎使用,並且只能在受控環境中使用。
  • 切勿將未匯出的 bar 類型暴露在目前套件之外。
  • 確保類型始終對齊,否則轉換會發生混亂。

範例:

package main

import "fmt"
import "unsafe"

type Foo struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}

type bar struct {
    Name string `json:"employee_name"`
    Age  int    `json:"-"`
}

func main() {
    f := Foo{Name: "Sam", Age: 20}
    b := (*bar)(unsafe.Pointer(&f))

    fmt.Println(b.Name, b.Age) // Output: Sam 0

    // Changing f.Age affects b.Age
    f.Age = 30
    fmt.Println(b.Name, b.Age) // Output: Sam 30
}
登入後複製

以上是如何使用未匯出的結構和類型轉換來解決 Go 的 JSON 標籤限制?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板