php小編香蕉將為大家介紹如何將已知類型轉換為指向開關中類型參數(shù)的指針。在編程中,有時我們需要將一個已知類型的變量轉換為指針,以便在程序中更靈活地操作。這種轉換可以通過使用“&”運算符來實現(xiàn)。將變量名前加上“&”運算符,即可將其轉換為指向該變量的指針。這樣,我們就可以在程序中使用指針來操作變量,而不僅僅是對其進行賦值或讀取操作。接下來,我們將詳細介紹如何進行這種類型轉換,并提供示例代碼幫助大家更好地理解。
問題內容
我正在嘗試編寫一個函數(shù),根據(jù)返回值的類型參數(shù),將 json 字符串的字節(jié)數(shù)組轉換為另一個字節(jié)數(shù)組,規(guī)則如下:
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 時出現(xiàn)類型錯誤,如下所示:
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
),您最好更改調用站點而不是使用通用函數(shù)。
我假設您的目標是允許調用者按原樣獲取字節(jié)切片,而不是解組。然后在調用站點,您可以將該函數(shù)調用為
data := GetJsonData[[]byte](jsonByteArray)
登錄后復制
這意味著此時您已經知道 jsonbytearray
是一個字節(jié)切片。
那么,就沒有理由調用該函數(shù)了。您可以簡單地獲取參數(shù)的地址: data := &jsonbytearray
,并在其他地方使用 json.unmarshal
。