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

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

Go:指向 interface{} 的指針丟失了底層類型

Go:指向 interface{} 的指針丟失了底層類型

Go
慕慕森 2021-08-30 16:31:28
我正在使用 Go 中的一些“通用”函數(shù),這些函數(shù)在interface{}通道上運(yùn)行和發(fā)送東西等等。瘦下來,假設(shè)我有這樣的東西:type MyType struct {    // Fields}func (m *MyType) MarshalJSON() ([]byte, error) {    // MarshalJSON    log.Print("custom JSON marshal")    return []byte("hello"), nil}func GenericFunc(v interface{}) {    // Do things...    log.Print(reflect.TypeOf(v))    log.Print(reflect.TypeOf(&v))    b, _ = json.Marshal(&v)    fmt.Println(string(b))}func main() {    m := MyType{}    GenericFunc(m)}這輸出:2014/11/16 12:41:44 MyType 2014/11/16 12:41:44 *interface {}其次是默認(rèn)json.Marshal輸出,而不是自定義輸出。據(jù)我所知,這是因?yàn)檎{(diào)用Marshal看到的是指向接口的指針而不是指向 MyType 的指針類型的值。為什么我在服用時(shí)會(huì)丟失類型信息&v?我希望輸出的第二行是*MyType而不是*interface {}.有什么方法可以讓我在不顯式轉(zhuǎn)換的情況下調(diào)用自定義 JSON Marshaller?
查看完整描述

2 回答

?
夢(mèng)里花落0921

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超6個(gè)贊

只需將指針傳遞給您的結(jié)構(gòu),而不是將其值傳遞給函數(shù)。指針仍然存在,interface{}但是指向接口的指針是沒有意義的。


查看完整回答
反對(duì) 回復(fù) 2021-08-30
?
蕭十郎

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個(gè)贊

聽起來您想通過 a 發(fā)送非指針值chan interface{}并讓自定義MarshalJSON方法按預(yù)期工作。在這種情況下,不要在指針類型上定義方法。


package main


import (

    "encoding/json"

    "fmt"

    "log"

    "time"

)


func printer(in chan interface{}) {

    for val := range in {

        buf, err := json.Marshal(val)

        if err != nil {

            log.Println(err.Error())

        }

        log.Println(string(buf))

    }

}


type MyType struct {

    name string

}


func (m MyType) MarshalJSON() ([]byte, error) {

    return []byte(fmt.Sprintf(`"%s"`, m.name)), nil

}


func main() {

    ch := make(chan interface{})


    go printer(ch)

    ch <- "string value"

    ch <- 25

    ch <- MyType{

        name: "foo",

    }


    time.Sleep(time.Second)

}

唯一真正的區(qū)別是方法接收器。func (m MyType) MarshalJSON ([]byte, error)代替func (m *MyType) MarshalJSON ([]byte, error)


查看完整回答
反對(duì) 回復(fù) 2021-08-30
  • 2 回答
  • 0 關(guān)注
  • 283 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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