亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

來自流中的字符串,用于多種對象類型

來自流中的字符串,用于多種對象類型

Go
江戶川亂折騰 2021-08-23 17:07:39
我習慣了 Java,并在 google go 中設置了第一步。我有一棵帶有子對象等的對象樹……這棵樹被遞歸地轉儲到 io.Writer。輸出可能很大,所以我不想為每個對象創建一個字符串,并將結果連接到內存中..出于調試目的,我想 fmt.Printf 這棵樹的部分。因此,我想在調用 ToStream 函數的每個對象上創建一個通用的 String() 函數,將結果作為字符串返回。在 Java 中,這很簡單:在基類上創建方法。如何在 GO 中執行此操作,而不為每種對象創建自定義 String 方法。查看我想要的代碼,特別是標記為 ERROR 的行package mainimport ("io""fmt""bytes")//Base is an interface for bulk outputtype Base interface {    ToStream(io.Writer)}//Impl1 has interface Basetype Impl1 struct{    stuff int}func (Impl1) ToStream(w io.Writer) {    fmt.Fprintf(w, "A lot of stuff")}//Impl2 has interface Basetype Impl2 struct{    otherstuff int}func (Impl2) ToStream(w io.Writer) {    fmt.Fprintf(w, "A lot of other stuff")}//I want to convert any base to a sting for debug output//This should happen by the ToStream methodfunc (v Base) String() string {//ERROR here: Invalid receiver type Base (Base is an interface type)//func (v Impl1) String() string {//This works, but requires re-implementation for every struct Impl1,Impl2,...    var buffer bytes.Buffer    v.ToStream(&buffer)    return string(buffer.Bytes())}func main(){    aBase:= new(Impl1)    fmt.Printf("%s\n",aBase)}
查看完整描述

3 回答

?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

您可以環繞 Base 以添加必要的String()功能。這是一種方法:


type StreamerToStringer struct {

    Base

}


func (s StreamerToStringer) String() string {

    var buffer bytes.Buffer

    s.Base.ToStream(&buffer)

    return string(buffer.Bytes())

}

有了這個,你可以增加任何Base實例,讓它有一個String()方法。


func main() {

    aBase1 := StreamerToStringer{new(Impl1)}

    aBase2 := StreamerToStringer{new(Impl2)}

    fmt.Printf("%s\n", aBase1)

    fmt.Printf("%s\n", aBase2)


    // These wrapped values still support ToStream().

    var buffer bytes.Buffer

    aBase1.ToStream(&buffer)

    fmt.Println(buffer.Bytes())

}


查看完整回答
反對 回復 2021-08-23
?
拉莫斯之舞

TA貢獻1820條經驗 獲得超10個贊

似乎 Java 思維在這里阻止了您 :-)


雖然Java有方法只去不具備的功能。當然,你不能在接口上有方法,但你可以制作一個簡單的函數,接受 aBase并做一些事情:


func Base2String(b Base) string {

    var buffer bytes.Buffer

    b.ToStream(&buffer)

    return string(buffer.Bytes())

}

現在,如果您將 Base 重命名為 Go 風格的東西(請記住,Go 中沒有類型層次結構),您將獲得一些不錯的代碼。


查看完整回答
反對 回復 2021-08-23
  • 3 回答
  • 0 關注
  • 186 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號