首頁  >  文章  >  後端開發  >  如何將已知類型轉換為指向開關中類型參數的指標?

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

王林
王林轉載
2024-02-09 11:30:181016瀏覽

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

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刪除