Bayt dilimini io.Okuyucusuna dönüştür


177

Projemde, bir isteğin yanıtından bir bayt dilim var.

defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
    log.Println("StatusCode为" + strconv.Itoa(resp.StatusCode))
    return
}

respByte, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Println("fail to read response data")
    return
}

Bu işe yarar, ancak yanıtın vücudunu almak istersem io.Readernasıl dönüştürebilirim? Yeni okuyucuyu / yazarı denedim ama başarılı olamadım.


3
Eğer doğru anlıyorsam, cevap ister misiniz io.Reader? Bu durumda, vücut zaten bu tiptedir.
Arjan

3
golang.org/pkg/bytes/#NewReader bir "dönüş" olacak []bytebir etmek io.Reader(ve io.ReadSeeker)
ANisus

@Arjan yap ~ body ... io.reader .but olarak yanıt almak istiyorum, ancak isteği bitirdiğimde temel sınıfta, yanıt öldürüldü .. bir yanıt gövdesini yapıda [] bayt olarak kaydedin.
Chan Willson

@ Anisus çalışacağım .... thx dostum .. bu arada ... farklı bir tür gibi görünüyor ..
Chan Willson

@ChanWillson: Bu gereklilik daha mantıklı, vücut kapatıldıktan sonra okunamıyor. Önerildiği gibi arayüzü *bytes.Readeruygulayan kullanımı io.Reader.
Arjan

Yanıtlar:


304

Uygular bir tür elde etmek için io.Readerbir gelen []bytedilim kullanabileceğiniz bytes.NewReaderiçinde bytespaketin:

r := bytes.NewReader(byteData)

Bu bytes.Reader, io.Reader(ve io.ReadSeeker) arabirimini uygulayan türde bir değer döndürür .

Aynı "tip" olmadıkları için endişelenmeyin. io.Readerbir arayüzdür ve birçok farklı tip tarafından uygulanabilir. Go'daki arabirimler hakkında biraz daha fazla bilgi edinmek için Etkili Go: Arabirimler ve Türler bölümünü okuyun .


A'yı bir []bytehaline dönüştürmek için benzer bir işlev var mı io.Writer? Egbytes.NewWriter(destination)
byxor

4
@byxor Evet, aradığınız şey bytes.Buffer. Eğer uygular bir tampon vardır oluşturmak io.Writerböyle: w := bytes.NewBuffer(destination).
ANisus

Bu hatayı anlamıyorum govet: cannot use *bytes.NewReader(out.Bytes()) (type bytes.Reader) as type io.Reader in argument to ioutil.NopCloser:(
Vitaly Zdanevich

1
@VitalyZdanevich Bunun nedeni bytes.Reader, işaretçi alıcıları olması ve bunu bir işaretçi türünden ( *bytes.Reader) temel türüne ( bytes.Reader) çevirmenizdir . Sadece yıldız ( *) kurtulmak ve iyi olmalı :)
ANisus

-18
r := strings(byteData)

Bu aynı zamanda sırayla çalışır []byteiçineio.Reader


4
Dizeleri bir paket, bu yüzden dize (byteData) anlamına geliyordu varsayıyorum. Bayt diliminden bu şekilde bir dize alabilirsiniz (eksi s). String, Read () yöntemine sahip olmadığı için io.Reader arabirimini uygulamaz. play.golang.org/p/eRMmtHsscd , bir dizede Read () çağrıldığında başarısız olan bir örnektir.
jeffrey
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.