package main import ( "fmt" "io" "strings" ) type marshaler interface { marshal(any, io.Writer) error } type rawMarshaler struct { m marshaler checkNul bool } func (m *rawMarshaler) marshal(v any, w io.Writer) error { if s, ok := v.(string); ok { if m.checkNul && strings.ContainsRune(s, '\x00') { return fmt.Errorf("cannot output a string containing NUL character: %q", s) } _, err := w.Write([]byte(s)) return err } return m.m.marshal(v, w) }