go - "wrap it in a bufio.NewReader if it doesn't support ReadByte" pattern -


this question has answer here:

following snippet 1 of go libs. please point out significance of r.(bytereader)? syntax usage not obvious novice. bytereader defined interface , not seem member of io.reader. since, seems kind of nifty code, can provide insight.

the author mentions: "wrap in bufio.newreader if doesn't support readbyte" pattern. https://github.com/dave-andersen/deltagolomb/blob/master/deltagolomb.go

type bytereader interface {     io.reader     readbyte() (c byte, err error) }  func makereader(r io.reader) bytereader {     if rr, ok := r.(bytereader); ok {         return rr     }     return bufio.newreader(r) } 

r.(bytereader) called type assertion. if io.reader doesn't implement bytereader interface in itself, it still possible value stored in r might implement bytereader. so, doing type assertion, can assert if case:

the specification states:

x.(t) asserts x not nil , value stored in x of type t. notation x.(t) called type assertion.
...
if t interface type, x.(t) asserts dynamic type of x implements interface t.

edit

the comment, "wrap in bufio.newreader", refers makereader's provided io.reader; if doesn't implement bytereader, makereader wrap in bufio.reader implement bytesreader, , return instead.


Comments

Popular posts from this blog

c# - Binding a comma separated list to a List<int> in asp.net web api -

Delphi 7 and decode UTF-8 base64 -

html - Is there any way to exclude a single element from the style? (Bootstrap) -