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

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

如何在 Java 中編寫等同于匿名類的內容?

如何在 Java 中編寫等同于匿名類的內容?

Go
白豬掌柜的 2023-04-04 15:33:43
這更像是一個與接口/函數/閉包/類型/...相關的通用 Go 問題,但具有執行 I/O 的具體用例。給定一個io.Reader變量,我想創建一個io.ReadCloser自定義Close()實現。var file os.Filefile = ... // some File which needs to be closedvar reader io.Readerreader = ... // get Reader from somewherevar readCloser io.ReadCloserreadCloser = ... // how to create a ReadCloser here?在Java中,我會寫這樣的東西:readCloser = new io.ReadCloser() {    Read(p []byte) {        reader.Read(p);    }    Close() {        // my custom close implementation        file.Close()    }    }// now pass readCloser around as needed如何用 Go 做到這一點?
查看完整描述

2 回答

?
慕后森

TA貢獻1802條經驗 獲得超5個贊

從中得到提示http.HandlerFunc,我可以想到以下內容


package main


import (

    "bytes"

    "fmt"

    "io"

    "strings"

)


// ReadData reads data from an io.Reader

func ReadData(r io.Reader) {

    buf := new(bytes.Buffer)

    buf.ReadFrom(r)

    s := buf.String()

    fmt.Printf("read : %s \n", s)

}


// ReaderFunc takes a function and returns io.Reader

type ReaderFunc func([]byte) (int, error)


func (r ReaderFunc) Read(b []byte) (int, error) {

    return r(b)

}


func main() {

    // invoking ReadData with a regular io.Reader

    r := strings.NewReader("data 123")

    ReadData(r)


    // invoking ReadData with an anonymous io.Reader

    r = strings.NewReader("data 456")

    ReadData(ReaderFunc(func(b []byte) (int, error) {

        return r.Read(b)

    }))

}


查看完整回答
反對 回復 2023-04-04
?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

一種方法是創建您自己的類型,將 aio.Reader和 a結合起來io.Closer并實現io.ReadCloser接口。是這樣的:


type ReadCloseCombiner struct {

    io.Reader

    io.Closer

}


func (rcc ReadCloseCombiner) Read(p []byte) (n int, err error) {

    return rcc.Reader.Read(p)

}


func (rcc ReadCloseCombiner) Close() error {

    return rcc.Closer.Close()

}

并像這樣使用它:


var file *os.File

file = ... // some File which needs to be closed


var reader io.Reader

reader = ... // get Reader from somewhere


var readCloser io.ReadCloser

readCloser = ReadCloseCombiner{reader, file}


// now pass readCloser around as needed

readCloser.Read(...)

readCloser.Close()

如果您想要更靈活的東西,我會考慮使用一種類型來代替讀取和關閉函數,然后您可以將它傳遞給匿名函數(或者甚至reader.Read/file.Close在您的情況下)。

一種方法是創建您自己的類型,將 aio.Reader和 a結合起來io.Closer并實現io.ReadCloser接口。是這樣的:


type ReadCloseCombiner struct {

    io.Reader

    io.Closer

}


func (rcc ReadCloseCombiner) Read(p []byte) (n int, err error) {

    return rcc.Reader.Read(p)

}


func (rcc ReadCloseCombiner) Close() error {

    return rcc.Closer.Close()

}

并像這樣使用它:


var file *os.File

file = ... // some File which needs to be closed


var reader io.Reader

reader = ... // get Reader from somewhere


var readCloser io.ReadCloser

readCloser = ReadCloseCombiner{reader, file}


// now pass readCloser around as needed

readCloser.Read(...)

readCloser.Close()

如果您想要更靈活的東西,我會考慮使用一種類型來代替讀取和關閉函數,然后您可以將它傳遞給匿名函數(或者甚至reader.Read/file.Close在您的情況下)。


查看完整回答
反對 回復 2023-04-04
  • 2 回答
  • 0 關注
  • 142 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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