1 回答

TA貢獻(xiàn)1818條經(jīng)驗(yàn) 獲得超11個(gè)贊
正在反序列化的接縫
不要對(duì)代碼中的成功和失敗做出假設(shè)。錯(cuò)誤響應(yīng)是了解函數(shù)是否成功的唯一可靠方法。在這種情況下,假設(shè)可能成立,但忽略錯(cuò)誤始終是錯(cuò)誤的?;〞r(shí)間捕捉錯(cuò)誤,至少panic
是它們——不要浪費(fèi)時(shí)間忽略錯(cuò)誤,然后嘗試調(diào)試不可靠的代碼。
無(wú)效操作:out["abcd.jp"](類(lèi)型接口{}不支持索引)
不幸的是,您使用的包沒(méi)有提供任何文檔,因此您必須閱讀源代碼才能了解gophp.Unserialize
返回(interface{}, error)
。這是有道理的;php可以序列化任何值,所以Unserialize
必須能夠返回任何值。
out
因此,interface{}
它的基礎(chǔ)價(jià)值取決于數(shù)據(jù)。要將 ainterface{}
轉(zhuǎn)換為特定值需要類(lèi)型斷言。在這種情況下,我們認(rèn)為基礎(chǔ)數(shù)據(jù)應(yīng)該是map[string]interface{}
. 所以我們需要做一個(gè)類(lèi)型斷言:
mout, ok := out.(map[string]interface{})
在我們討論工作代碼之前,我希望您再考慮一點(diǎn)。看下面的代碼:我是從你的代碼開(kāi)始的,但相似之處非常輕微。我取出了幾乎所有代碼,因?yàn)樗c您的問(wèn)題完全無(wú)關(guān)。我將輸入數(shù)據(jù)添加到代碼中,以盡可能少地復(fù)制您的代碼(正如我要求您這樣做而您拒絕這樣做)。這是對(duì)您時(shí)間的一種很好的利用,原因有兩個(gè):首先,它使您更容易獲得答案(既因?yàn)樗砻髂冻隽俗銐虻呐?,也因?yàn)樗?jiǎn)化了對(duì)問(wèn)題的描述),其次,因?yàn)樗钦{(diào)試的絕佳實(shí)踐。我一直對(duì)代碼流進(jìn)行最少的復(fù)制,以更好地理解如何做事。
您會(huì)注意到您現(xiàn)在可以運(yùn)行此代碼而無(wú)需任何額外的努力。這是提供最小可重現(xiàn)示例的正確方法——而不是使用一大塊仍然無(wú)法由任何人執(zhí)行的幾乎不相關(guān)的代碼。
Go Plaground 是演示其他人可以執(zhí)行和調(diào)查的特定于 go 的代碼的好方法。您還可以在https://go.dev/play/p/QfCl08Gx53e看到下面的代碼
package main
import (
"fmt"
"github.com/techoner/gophp"
)
type Data struct {
Website string
Debug bool
}
func main() {
var dat = []byte(`a:2:{i:250;s:7:"my_catz";s:7:"abcd.jp";a:2:{s:11:"category_id";i:250;s:13:"category_name";s:7:"my_catz";}}`)
out, err := gophp.Unserialize(dat)
if err != nil {
panic(err)
}
if mout, ok := out.(map[string]interface{}); ok {
fmt.Println(mout["abcd.jp"])
}
}
- 1 回答
- 0 關(guān)注
- 154 瀏覽
添加回答
舉報(bào)