第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

在goland反序列化php

在goland反序列化php

Go
慕標(biāo)琳琳 2022-11-08 16:33:11
我在 PHP 中有一個(gè)帶有序列化數(shù)組的文件。文件的內(nèi)容像這樣鎖定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";}}未序列化的數(shù)組是這個(gè)(    [250] => my_catz    [abcd.jp] => Array        (            [category_id] => 250            [category_name] => my_catz        ))現(xiàn)在,我想在 GO 中獲取文件的內(nèi)容,將其反序列化并將其轉(zhuǎn)換為數(shù)組。在 GO 中,我可以使用dat, err := os.ReadFile("/etc/squid3/compiled-categories.db")    if err != nil {        if e.Debug {            log.Printf("error reading /etc/squid3/compiled-categories.db: ", err)        }    }并使用 github.com/techoner/gophp 庫(kù)對(duì)其進(jìn)行反序列化package categorizationimport (      "fmt"    "os"    "github.com/techoner/gophp"    "log"    "errors")type Data struct {      Website   string    Debug   bool}func (e Data) CheckPersonalCategories() (int,string) {      if e.Debug {        log.Printf("Checking Personal Categories")    }    if _, err := os.Stat("/etc/squid3/compiled-categories.db"); errors.Is(err, os.ErrNotExist) {        if e.Debug {            log.Printf("/etc/squid3/compiled-categories.db not exit: ", err)        }        return  0,""    }    dat, err := os.ReadFile("/etc/squid3/compiled-categories.db")    if err != nil {        if e.Debug {            log.Printf("error reading /etc/squid3/compiled-categories.db: ", err)        }    }        out, _ := gophp.Unserialize(dat)        fmt.Println(out["abcd.jp"])return  0,""}但我無(wú)法訪(fǎng)問(wèn)數(shù)組,例如,當(dāng)我嘗試使用 out["abcd.jp"] 訪(fǎng)問(wèn)數(shù)組鍵時(shí),我收到此錯(cuò)誤消息invalid operation: out["abcd.jp"] (type interface {} does not support indexing)out的結(jié)果是map[250:my_catz abcd.jp:map[category_id:250 category_name:my_catz]]
查看完整描述

1 回答

?
慕尼黑8549860

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"])

    }

}


查看完整回答
反對(duì) 回復(fù) 2022-11-08
  • 1 回答
  • 0 關(guān)注
  • 154 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)