Source File
encoder.go
Belonging Package
encoding/gob
package gob
import (
)
type Encoder struct {
mutex sync.Mutex // each item must be sent atomically
w []io.Writer // where to send the data
sent map[reflect.Type]typeId // which types we've already sent
countState *encoderState // stage for writing counts
freeList *encoderState // list of free encoderStates; avoids reallocation
byteBuf encBuffer // buffer for top-level encoderState
err error
}
const maxLength = 9 // Maximum size of an encoded length.
var spaceForLength = make([]byte, maxLength)
:= .Bytes()
.countState.b.Reset()
:= maxLength - .countState.b.Len()
.Reset()
.Write(spaceForLength)
if != nil {
.setError()
}
}
func ( *Encoder) ( io.Writer, *encoderState, *userTypeInfo, reflect.Type) ( bool) {
if , := .sent[]; {
return false
}
, := getTypeInfo()
if != nil {
.setError()
return
.encode(.b, reflect.ValueOf(.wire), wireTypeUserInfo)
.writeMessage(, .b)
if .err != nil {
return
}
return .sendActualType(, , , .base)
}
return
break
break
break
break
return
}
return .sendActualType(, , , .base)
}
func ( *Encoder) ( interface{}) error {
return .EncodeValue(reflect.ValueOf())
}
:= .base
if .externalEnc != 0 {
= .user
}
if ! {
, := getTypeInfo()
if != nil {
.setError()
return
}
.sent[] = .id
}
}
}
.w = .w[0:1]
, := validUserType(.Type())
if != nil {
return
}
.err = nil
.byteBuf.Reset()
.byteBuf.Write(spaceForLength)
:= .newEncoderState(&.byteBuf)
.sendTypeDescriptor(.writer(), , )
.sendTypeId(, )
if .err != nil {
return .err
}
.encode(.b, , )
if .err == nil {
.writeMessage(.writer(), .b)
}
.freeEncoderState()
return .err
![]() |
The pages are generated with Golds v0.3.2-preview. (GOOS=darwin GOARCH=amd64) Golds is a Go 101 project developed by Tapir Liu. PR and bug reports are welcome and can be submitted to the issue list. Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds. |