首頁 > 後端開發 > Golang > 主體

如何將已知類型轉換為指向開關中類型參數的指標?

王林
發布: 2024-02-09 11:30:18
轉載
994 人瀏覽過

如何將已知類型轉換為指向開關中類型參數的指標?

php小編香蕉將為大家介紹如何將已知型別轉換為指向開關中型別參數的指標。在程式設計中,有時我們需要將一個已知類型的變數轉換為指針,以便在程式中更靈活地操作。這種轉換可以透過使用“&”運算符來實現。將變數名前加上“&”運算符,即可轉換為指向該變數的指標。這樣,我們就可以在程式中使用指標來操作變量,而不僅僅是對其進行賦值或讀取操作。接下來,我們將詳細介紹如何進行這種類型轉換,並提供範例程式碼幫助大家更好地理解。

問題內容

我正在嘗試編寫一個函數,根據返回值的類型參數,將json 字串的位元組數組轉換為另一個位元組數組,規則如下:

  • map[string]interface{}:轉換為map[string]interface{}
  • []byte:不轉換,按原樣回傳
  • struct:轉換為struct

我的程式碼如下:

func getjsondata[t any](jsonbytearray []byte) (result *t, err error) {
    var buff t

    switch any(result).(type) { // https://appliedgo.com/blog/a-tip-and-a-trick-when-working-with-generics
    case *[]byte:
        result = &t(jsonbytearray)
    default:
        err = json.unmarshal(jsonbytearray, &buff)
        result = &buff
    }

    return
}
登入後複製

此程式碼在將 jsonbytearray 的類型轉換為 t 時出現類型錯誤,如下所示:

cannot convert jsonByteArray (variable of type []byte) to type T
登入後複製

如何將這個[]byte類型變數的指標賦給泛型類型回傳值?

解決方法

由於t受到any的約束,所以不能直接轉換。您必須斷言 &jsonbytearray 實際上與該開關情況下的 *t 類型相同:

func getjsondata[t any](jsonbytearray []byte) (result *t, err error) {
    var buff t

    switch any(result).(type) {
    case *[]byte:
        result = any(&jsonbytearray).(*t)
    default:
        err = json.unmarshal(jsonbytearray, &buff)
        result = &buff
    }

    return
}
登入後複製

這使得編譯錯誤消失,但這並不是特別好的設計。如果您需要將 json.unmarshal 專門用於一種類型 (*[]byte),您最好更改呼叫網站而不是使用通用函數。

我假設您的目標是允許呼叫者按原樣獲取位元組切片,而不是解組。然後在呼叫站點,您可以將該函數呼叫為

data := GetJsonData[[]byte](jsonByteArray)
登入後複製

這表示此時您已經知道 jsonbytearray 是一個位元組切片。

那麼,就沒有理由呼叫該函數了。您可以簡單地取得參數的位址: data := &jsonbytearray ,並在其他地方使用 json.unmarshal

以上是如何將已知類型轉換為指向開關中類型參數的指標?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!