THRIFT-2866: Go - generator code readability enhanced

Client: Go
Patch: Chi Vinh Le

This closes #295
diff --git a/compiler/cpp/src/generate/t_go_generator.cc b/compiler/cpp/src/generate/t_go_generator.cc
index 0c8dd00..691684a 100644
--- a/compiler/cpp/src/generate/t_go_generator.cc
+++ b/compiler/cpp/src/generate/t_go_generator.cc
@@ -795,10 +795,14 @@
   std::string tenum_name(publicize(tenum->get_name()));
   generate_go_docstring(f_types_, tenum);
   f_types_ << "type " << tenum_name << " int64" << endl << "const (" << endl;
-  to_string_mapping << indent() << "func (p " << tenum_name << ") String() string {" << endl
-                    << indent() << "  switch p {" << endl;
+
+  to_string_mapping << indent() << "func (p " << tenum_name << ") String() string {" << endl;
+  to_string_mapping << indent() << "  switch p {" << endl;
+
   from_string_mapping << indent() << "func " << tenum_name << "FromString(s string) (" << tenum_name
-                      << ", error) {" << endl << indent() << "  switch s {" << endl;
+                      << ", error) {" << endl;
+  from_string_mapping << indent() << "  switch s {" << endl;
+
   vector<t_enum_value*> constants = tenum->get_constants();
   vector<t_enum_value*>::iterator c_iter;
   int value = -1;
@@ -824,12 +828,13 @@
     }
   }
 
-  to_string_mapping << indent() << "  }" << endl << indent() << "  return \"<UNSET>\"" << endl
-                    << indent() << "}" << endl;
-  from_string_mapping << indent() << "  }" << endl << indent() << "  return " << tenum_name
-                      << "(0),"
-                      << " fmt.Errorf(\"not a valid " << tenum_name << " string\")" << endl
-                      << indent() << "}" << endl;
+  to_string_mapping << indent() << "  }" << endl;
+  to_string_mapping << indent() << "  return \"<UNSET>\"" << endl;
+  to_string_mapping << indent() << "}" << endl;
+  from_string_mapping << indent() << "  }" << endl;
+  from_string_mapping << indent() << "  return " << tenum_name << "(0),"
+                      << " fmt.Errorf(\"not a valid " << tenum_name << " string\")" << endl;
+  from_string_mapping << indent() << "}" << endl;
 
   f_types_ << ")" << endl << endl << to_string_mapping.str() << endl << from_string_mapping.str()
            << endl << endl;
@@ -1130,8 +1135,9 @@
   }
 
   indent_down();
-  out << indent() << "}" << endl << endl << indent() << "func New" << tstruct_name << "() *"
-      << tstruct_name << " {" << endl << indent() << "  return &";
+  out << indent() << "}" << endl << endl;
+  out << indent() << "func New" << tstruct_name << "() *" << tstruct_name << " {" << endl;
+  out << indent() << "  return &";
   generate_go_struct_initializer(out, tstruct, is_result || is_args);
   out << indent() << "}" << endl << endl;
   // Default values for optional fields
@@ -1153,14 +1159,18 @@
       string goOptType = type_to_go_type_with_opt(fieldType, true);
       string maybepointer = goOptType != goType ? "*" : "";
       out << indent() << "func (p *" << tstruct_name << ") Get" << publicized_name << "() "
-          << goType << " {" << endl << indent() << "  if !p.IsSet" << publicized_name << "() {"
-          << endl << indent() << "    return " << def_var_name << endl << indent() << "  }" << endl
-          << indent() << "return " << maybepointer << "p." << publicized_name << endl << indent()
-          << "}" << endl;
+          << goType << " {" << endl;
+      out << indent() << "  if !p.IsSet" << publicized_name << "() {" << endl;
+      out << indent() << "    return " << def_var_name << endl;
+      out << indent() << "  }" << endl;
+      out << indent() << "return " << maybepointer << "p." << publicized_name << endl;
+      out << indent() << "}" << endl;
     } else {
-      out << endl << indent() << "func (p *" << tstruct_name << ") Get" << publicized_name << "() "
-          << goType << " {" << endl << indent() << "return p." << publicized_name << endl
-          << indent() << "}" << endl;
+      out << endl;
+      out << indent() << "func (p *" << tstruct_name << ") Get" << publicized_name << "() "
+          << goType << " {" << endl;
+      out << indent() << "  return p." << publicized_name << endl;
+      out << indent() << "}" << endl;
     }
   }
 
@@ -1168,14 +1178,18 @@
   generate_go_struct_reader(out, tstruct, tstruct_name, is_result);
   generate_go_struct_writer(out, tstruct, tstruct_name, is_result);
 
-  out << indent() << "func (p *" << tstruct_name << ") String() string {" << endl << indent()
-      << "  if p == nil {" << endl << indent() << "    return \"<nil>\"" << endl << indent()
-      << "  }" << endl << indent() << "  return fmt.Sprintf(\"" << escape_string(tstruct_name)
-      << "(%+v)\", *p)" << endl << indent() << "}" << endl << endl;
+  out << indent() << "func (p *" << tstruct_name << ") String() string {" << endl;
+  out << indent() << "  if p == nil {" << endl;
+  out << indent() << "    return \"<nil>\"" << endl;
+  out << indent() << "  }" << endl;
+  out << indent() << "  return fmt.Sprintf(\"" << escape_string(tstruct_name) << "(%+v)\", *p)"
+      << endl;
+  out << indent() << "}" << endl << endl;
 
   if (is_exception) {
-    out << indent() << "func (p *" << tstruct_name << ") Error() string {" << endl << indent()
-        << "  return p.String()" << endl << indent() << "}" << endl << endl;
+    out << indent() << "func (p *" << tstruct_name << ") Error() string {" << endl;
+    out << indent() << "  return p.String()" << endl;
+    out << indent() << "}" << endl << endl;
   }
 }
 
@@ -1233,17 +1247,19 @@
   out << indent() << "func (p *" << tstruct_name << ") Read(iprot thrift.TProtocol) error {"
       << endl;
   indent_up();
-  out << indent() << "if _, err := iprot.ReadStructBegin(); err != nil {" << endl << indent()
-      << "  return thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)" << endl
-      << indent() << "}" << endl;
+  out << indent() << "if _, err := iprot.ReadStructBegin(); err != nil {" << endl;
+  out << indent() << "  return thrift.PrependError(fmt.Sprintf(\"%T read error: \", p), err)"
+      << endl;
+  out << indent() << "}" << endl;
   // Loop over reading in fields
   indent(out) << "for {" << endl;
   indent_up();
   // Read beginning field marker
-  out << indent() << "_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()" << endl << indent()
-      << "if err != nil {" << endl << indent()
-      << "  return thrift.PrependError(fmt.Sprintf(\"%T field %d read error: \", p, fieldId), err)"
-      << endl << indent() << "}" << endl;
+  out << indent() << "_, fieldTypeId, fieldId, err := iprot.ReadFieldBegin()" << endl;
+  out << indent() << "if err != nil {" << endl;
+  out << indent() << "  return thrift.PrependError(fmt.Sprintf("
+                     "\"%T field %d read error: \", p, fieldId), err)" << endl;
+  out << indent() << "}" << endl;
   // Check for field STOP marker and break
   out << indent() << "if fieldTypeId == thrift.STOP { break; }" << endl;
 
@@ -1278,7 +1294,9 @@
     }
 
     out << indent() << "if err := p." << field_method_prefix << field_id << "(iprot); err != nil {"
-        << endl << indent() << "  return err" << endl << indent() << "}" << endl;
+        << endl;
+    out << indent() << "  return err" << endl;
+    out << indent() << "}" << endl;
     indent_down();
   }
 
@@ -1289,8 +1307,9 @@
   }
 
   // Skip unknown fields in either case
-  out << indent() << "if err := iprot.Skip(fieldTypeId); err != nil {" << endl << indent()
-      << "  return err" << endl << indent() << "}" << endl;
+  out << indent() << "if err := iprot.Skip(fieldTypeId); err != nil {" << endl;
+  out << indent() << "  return err" << endl;
+  out << indent() << "}" << endl;
 
   // End switch default case
   if (have_switch) {
@@ -1299,13 +1318,16 @@
   }
 
   // Read field end marker
-  out << indent() << "if err := iprot.ReadFieldEnd(); err != nil {" << endl << indent()
-      << "  return err" << endl << indent() << "}" << endl;
+  out << indent() << "if err := iprot.ReadFieldEnd(); err != nil {" << endl;
+  out << indent() << "  return err" << endl;
+  out << indent() << "}" << endl;
   indent_down();
-  out << indent() << "}" << endl << indent() << "if err := iprot.ReadStructEnd(); err != nil {"
-      << endl << indent()
-      << "  return thrift.PrependError(fmt.Sprintf(\"%T read struct end error: \", p), err)" << endl
-      << indent() << "}" << endl << indent() << "return nil" << endl;
+  out << indent() << "}" << endl;
+  out << indent() << "if err := iprot.ReadStructEnd(); err != nil {" << endl;
+  out << indent() << "  return thrift.PrependError(fmt.Sprintf("
+                     "\"%T read struct end error: \", p), err)" << endl;
+  out << indent() << "}" << endl;
+  out << indent() << "return nil" << endl;
   indent_down();
   out << indent() << "}" << endl << endl;
 
@@ -1325,7 +1347,8 @@
     indent_up();
     generate_deserialize_field(out, *f_iter, false, "p.");
     indent_down();
-    out << indent() << "  return nil" << endl << indent() << "}" << endl << endl;
+    out << indent() << "  return nil" << endl;
+    out << indent() << "}" << endl << endl;
   }
 }
 
@@ -1339,10 +1362,9 @@
   vector<t_field*>::const_iterator f_iter;
   indent(out) << "func (p *" << tstruct_name << ") Write(oprot thrift.TProtocol) error {" << endl;
   indent_up();
-  out << indent() << "if err := oprot.WriteStructBegin(\"" << name << "\"); err != nil {" << endl
-      << indent()
-      << "  return thrift.PrependError(fmt.Sprintf(\"%T write struct begin error: \", p), err) }"
-      << endl;
+  out << indent() << "if err := oprot.WriteStructBegin(\"" << name << "\"); err != nil {" << endl;
+  out << indent() << "  return thrift.PrependError(fmt.Sprintf("
+                     "\"%T write struct begin error: \", p), err) }" << endl;
 
   string field_name;
   string escape_field_name;
@@ -1366,11 +1388,11 @@
   }
 
   // Write the struct map
-  out << indent() << "if err := oprot.WriteFieldStop(); err != nil {" << endl << indent()
-      << "  return thrift.PrependError(\"write field stop error: \", err) }" << endl << indent()
-      << "if err := oprot.WriteStructEnd(); err != nil {" << endl << indent()
-      << "  return thrift.PrependError(\"write struct stop error: \", err) }" << endl << indent()
-      << "return nil" << endl;
+  out << indent() << "if err := oprot.WriteFieldStop(); err != nil {" << endl;
+  out << indent() << "  return thrift.PrependError(\"write field stop error: \", err) }" << endl;
+  out << indent() << "if err := oprot.WriteStructEnd(); err != nil {" << endl;
+  out << indent() << "  return thrift.PrependError(\"write struct stop error: \", err) }" << endl;
+  out << indent() << "return nil" << endl;
   indent_down();
   out << indent() << "}" << endl << endl;
 
@@ -1398,17 +1420,17 @@
     }
 
     out << indent() << "if err := oprot.WriteFieldBegin(\"" << escape_field_name << "\", "
-        << type_to_enum((*f_iter)->get_type()) << ", " << field_id << "); err != nil {" << endl
-        << indent() << "  return thrift.PrependError(fmt.Sprintf(\"%T write field begin error "
+        << type_to_enum((*f_iter)->get_type()) << ", " << field_id << "); err != nil {" << endl;
+    out << indent() << "  return thrift.PrependError(fmt.Sprintf(\"%T write field begin error "
         << field_id << ":" << escape_field_name << ": \", p), err) }" << endl;
 
     // Write field contents
     generate_serialize_field(out, *f_iter, "p.");
 
     // Write field closer
-    out << indent() << "if err := oprot.WriteFieldEnd(); err != nil {" << endl << indent()
-        << "  return thrift.PrependError(fmt.Sprintf(\"%T write field end error " << field_id << ":"
-        << escape_field_name << ": \", p), err) }" << endl;
+    out << indent() << "if err := oprot.WriteFieldEnd(); err != nil {" << endl;
+    out << indent() << "  return thrift.PrependError(fmt.Sprintf(\"%T write field end error "
+        << field_id << ":" << escape_field_name << ": \", p), err) }" << endl;
 
     if (field_required == t_field::T_OPTIONAL) {
       indent_down();
@@ -1416,7 +1438,8 @@
     }
 
     indent_down();
-    out << indent() << "  return err" << endl << indent() << "}" << endl << endl;
+    out << indent() << "  return err" << endl;
+    out << indent() << "}" << endl << endl;
   }
 }
 
@@ -1577,12 +1600,12 @@
   if (!extends_client.empty()) {
     f_service_ << indent() << "*" << extends_client << endl;
   } else {
-    f_service_ << indent() << "Transport thrift.TTransport" << endl << indent()
-               << "ProtocolFactory thrift.TProtocolFactory" << endl << indent()
-               << "InputProtocol thrift.TProtocol" << endl << indent()
-               << "OutputProtocol thrift.TProtocol" << endl << indent() << "SeqId int32"
-               << endl /*<<
-      indent() << "reqs map[int32]Deferred" << endl*/;
+    f_service_ << indent() << "Transport thrift.TTransport" << endl;
+    f_service_ << indent() << "ProtocolFactory thrift.TProtocolFactory" << endl;
+    f_service_ << indent() << "InputProtocol thrift.TProtocol" << endl;
+    f_service_ << indent() << "OutputProtocol thrift.TProtocol" << endl;
+    f_service_ << indent() << "SeqId int32" << endl;
+    /*f_service_ << indent() << "reqs map[int32]Deferred" << endl*/;
   }
 
   indent_down();
@@ -1598,11 +1621,12 @@
     f_service_ << "{" << extends_field << ": " << extends_client_new << "Factory(t, f)}";
   } else {
     indent_up();
-    f_service_ << "{Transport: t," << endl << indent() << "ProtocolFactory: f," << endl << indent()
-               << "InputProtocol: f.GetProtocol(t)," << endl << indent()
-               << "OutputProtocol: f.GetProtocol(t)," << endl << indent() << "SeqId: 0,"
-               << endl /*<<
-      indent() << "Reqs: make(map[int32]Deferred)" << endl*/;
+    f_service_ << "{Transport: t," << endl;
+    f_service_ << indent() << "ProtocolFactory: f," << endl;
+    f_service_ << indent() << "InputProtocol: f.GetProtocol(t)," << endl;
+    f_service_ << indent() << "OutputProtocol: f.GetProtocol(t)," << endl;
+    f_service_ << indent() << "SeqId: 0," << endl;
+    /*f_service_ << indent() << "Reqs: make(map[int32]Deferred)" << endl*/;
     indent_down();
     f_service_ << indent() << "}" << endl;
   }
@@ -1622,10 +1646,12 @@
                << endl;
   } else {
     indent_up();
-    f_service_ << "{Transport: t," << endl << indent() << "ProtocolFactory: nil," << endl
-               << indent() << "InputProtocol: iprot," << endl << indent()
-               << "OutputProtocol: oprot," << endl << indent() << "SeqId: 0," << endl /*<<
-      indent() << "Reqs: make(map[int32]interface{})" << endl*/;
+    f_service_ << "{Transport: t," << endl;
+    f_service_ << indent() << "ProtocolFactory: nil," << endl;
+    f_service_ << indent() << "InputProtocol: iprot," << endl;
+    f_service_ << indent() << "OutputProtocol: oprot," << endl;
+    f_service_ << indent() << "SeqId: 0," << endl;
+    /*f_service_ << indent() << "Reqs: make(map[int32]interface{})" << endl*/;
     indent_down();
     f_service_ << indent() << "}" << endl;
   }
@@ -1677,22 +1703,26 @@
     }
 
     indent_down();
-    f_service_ << indent() << "}" << endl << endl << indent() << "func (p *" << serviceName
-               << "Client) send" << function_signature(*f_iter) << "(err error) {" << endl;
+    f_service_ << indent() << "}" << endl << endl;
+    f_service_ << indent() << "func (p *" << serviceName << "Client) send"
+               << function_signature(*f_iter) << "(err error) {" << endl;
     indent_up();
     std::string argsname = publicize((*f_iter)->get_name() + "_args", true);
     // Serialize the request header
-    f_service_ << indent() << "oprot := p.OutputProtocol" << endl << indent() << "if oprot == nil {"
-               << endl << indent() << "  oprot = p.ProtocolFactory.GetProtocol(p.Transport)" << endl
-               << indent() << "  p.OutputProtocol = oprot" << endl << indent() << "}" << endl
-               << indent() << "p.SeqId++" << endl << indent()
-               << "if err = oprot.WriteMessageBegin(\"" << (*f_iter)->get_name() << "\", "
-               << ((*f_iter)->is_oneway() ? "thrift.ONEWAY" : "thrift.CALL")
+    f_service_ << indent() << "oprot := p.OutputProtocol" << endl;
+    f_service_ << indent() << "if oprot == nil {" << endl;
+    f_service_ << indent() << "  oprot = p.ProtocolFactory.GetProtocol(p.Transport)" << endl;
+    f_service_ << indent() << "  p.OutputProtocol = oprot" << endl;
+    f_service_ << indent() << "}" << endl;
+    f_service_ << indent() << "p.SeqId++" << endl;
+    f_service_ << indent() << "if err = oprot.WriteMessageBegin(\"" << (*f_iter)->get_name()
+               << "\", " << ((*f_iter)->is_oneway() ? "thrift.ONEWAY" : "thrift.CALL")
                << ", p.SeqId); err != nil {" << endl;
     indent_up();
-    f_service_ << indent() << "return" << endl;
+    f_service_ << indent() << "  return" << endl;
     indent_down();
-    f_service_ << indent() << "}" << endl << indent() << "args := " << argsname << "{" << endl;
+    f_service_ << indent() << "}" << endl;
+    f_service_ << indent() << "args := " << argsname << "{" << endl;
 
     for (fld_iter = fields.begin(); fld_iter != fields.end(); ++fld_iter) {
       f_service_ << indent() << publicize(variable_name_to_go_name((*fld_iter)->get_name()))
@@ -1703,14 +1733,15 @@
     // Write to the stream
     f_service_ << indent() << "if err = args.Write(oprot); err != nil {" << endl;
     indent_up();
-    f_service_ << indent() << "return" << endl;
+    f_service_ << indent() << "  return" << endl;
     indent_down();
-    f_service_ << indent() << "}" << endl << indent()
-               << "if err = oprot.WriteMessageEnd(); err != nil {" << endl;
+    f_service_ << indent() << "}" << endl;
+    f_service_ << indent() << "if err = oprot.WriteMessageEnd(); err != nil {" << endl;
     indent_up();
-    f_service_ << indent() << "return" << endl;
+    f_service_ << indent() << "  return" << endl;
     indent_down();
-    f_service_ << indent() << "}" << endl << indent() << "return oprot.Flush()" << endl;
+    f_service_ << indent() << "}" << endl;
+    f_service_ << indent() << "return oprot.Flush()" << endl;
     indent_down();
     f_service_ << indent() << "}" << endl << endl;
 
@@ -1729,31 +1760,42 @@
       // TODO(mcslee): Validate message reply here, seq ids etc.
       string error(tmp("error"));
       string error2(tmp("error"));
-      f_service_ << indent() << "iprot := p.InputProtocol" << endl << indent()
-                 << "if iprot == nil {" << endl << indent()
-                 << "  iprot = p.ProtocolFactory.GetProtocol(p.Transport)" << endl << indent()
-                 << "  p.InputProtocol = iprot" << endl << indent() << "}" << endl << indent()
-                 << "_, mTypeId, seqId, err := iprot.ReadMessageBegin()" << endl << indent()
-                 << "if err != nil {" << endl << indent() << "  return" << endl << indent() << "}"
-                 << endl << indent() << "if mTypeId == thrift.EXCEPTION {" << endl << indent()
-                 << "  " << error
+      f_service_ << indent() << "iprot := p.InputProtocol" << endl;
+      f_service_ << indent() << "if iprot == nil {" << endl;
+      f_service_ << indent() << "  iprot = p.ProtocolFactory.GetProtocol(p.Transport)" << endl;
+      f_service_ << indent() << "  p.InputProtocol = iprot" << endl;
+      f_service_ << indent() << "}" << endl;
+      f_service_ << indent() << "_, mTypeId, seqId, err := iprot.ReadMessageBegin()" << endl;
+      f_service_ << indent() << "if err != nil {" << endl;
+      f_service_ << indent() << "  return" << endl;
+      f_service_ << indent() << "}" << endl;
+      f_service_ << indent() << "if mTypeId == thrift.EXCEPTION {" << endl;
+      f_service_ << indent() << "  " << error
                  << " := thrift.NewTApplicationException(thrift.UNKNOWN_APPLICATION_EXCEPTION, "
-                    "\"Unknown Exception\")" << endl << indent() << "  var " << error2 << " error"
-                 << endl << indent() << "  " << error2 << ", err = " << error << ".Read(iprot)"
-                 << endl << indent() << "  if err != nil {" << endl << indent() << "    return"
-                 << endl << indent() << "  }" << endl << indent()
-                 << "  if err = iprot.ReadMessageEnd(); err != nil {" << endl << indent()
-                 << "    return" << endl << indent() << "  }" << endl << indent()
-                 << "  err = " << error2 << endl << indent() << "  return" << endl << indent()
-                 << "}" << endl << indent() << "if p.SeqId != seqId {" << endl << indent()
-                 << "  err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, \""
-                 << (*f_iter)->get_name() << " failed: out of sequence response\")" << endl
-                 << indent() << "  return" << endl << indent() << "}" << endl << indent()
-                 << "result := " << resultname << "{}" << endl << indent()
-                 << "if err = result.Read(iprot); err != nil {" << endl << indent() << "  return"
-                 << endl << indent() << "}" << endl << indent()
-                 << "if err = iprot.ReadMessageEnd(); err != nil {" << endl << indent()
-                 << "  return" << endl << indent() << "}" << endl;
+                    "\"Unknown Exception\")" << endl;
+      f_service_ << indent() << "  var " << error2 << " error" << endl;
+      f_service_ << indent() << "  " << error2 << ", err = " << error << ".Read(iprot)" << endl;
+      f_service_ << indent() << "  if err != nil {" << endl;
+      f_service_ << indent() << "    return" << endl;
+      f_service_ << indent() << "  }" << endl;
+      f_service_ << indent() << "  if err = iprot.ReadMessageEnd(); err != nil {" << endl;
+      f_service_ << indent() << "    return" << endl;
+      f_service_ << indent() << "  }" << endl;
+      f_service_ << indent() << "  err = " << error2 << endl;
+      f_service_ << indent() << "  return" << endl;
+      f_service_ << indent() << "}" << endl;
+      f_service_ << indent() << "if p.SeqId != seqId {" << endl;
+      f_service_ << indent() << "  err = thrift.NewTApplicationException(thrift.BAD_SEQUENCE_ID, \""
+                 << (*f_iter)->get_name() << " failed: out of sequence response\")" << endl;
+      f_service_ << indent() << "  return" << endl;
+      f_service_ << indent() << "}" << endl;
+      f_service_ << indent() << "result := " << resultname << "{}" << endl;
+      f_service_ << indent() << "if err = result.Read(iprot); err != nil {" << endl;
+      f_service_ << indent() << "  return" << endl;
+      f_service_ << indent() << "}" << endl;
+      f_service_ << indent() << "if err = iprot.ReadMessageEnd(); err != nil {" << endl;
+      f_service_ << indent() << "  return" << endl;
+      f_service_ << indent() << "}" << endl;
 
       t_struct* xs = (*f_iter)->get_xceptions();
       const std::vector<t_field*>& xceptions = xs->get_members();
@@ -1763,9 +1805,10 @@
         const std::string varname = variable_name_to_go_name((*x_iter)->get_name());
         const std::string pubname = publicize(varname);
 
-        f_service_ << indent() << "if result." << pubname << " != nil {" << endl << indent()
-                   << "err = result." << pubname << endl << indent() << "return " << endl
-                   << indent() << "}";
+        f_service_ << indent() << "if result." << pubname << " != nil {" << endl;
+        f_service_ << indent() << "  err = result." << pubname << endl;
+        f_service_ << indent() << "  return " << endl;
+        f_service_ << indent() << "}";
 
         if ((x_iter + 1) != xceptions.end()) {
           f_service_ << " else ";
@@ -1818,18 +1861,27 @@
     service_module.replace(loc, 1, 1, '/');
   }
 
-  f_remote << go_autogen_comment() << indent() << "package main" << endl << endl << indent()
-           << "import (" << endl << indent() << "        \"flag\"" << endl << indent()
-           << "        \"fmt\"" << endl << indent() << "        \"math\"" << endl << indent()
-           << "        \"net\"" << endl << indent() << "        \"net/url\"" << endl << indent()
-           << "        \"os\"" << endl << indent() << "        \"strconv\"" << endl << indent()
-           << "        \"strings\"" << endl << indent() << "        \"" + gen_thrift_import_ + "\""
-           << endl << indent() << "        \"" << service_module << "\"" << endl << indent() << ")"
-           << endl << indent() << endl << indent() << "func Usage() {" << endl << indent()
-           << "  fmt.Fprintln(os.Stderr, \"Usage of \", os.Args[0], \" [-h host:port] [-u url] "
-              "[-f[ramed]] function [arg1 [arg2...]]:\")" << endl << indent()
-           << "  flag.PrintDefaults()" << endl << indent()
-           << "  fmt.Fprintln(os.Stderr, \"\\nFunctions:\")" << endl;
+  f_remote << go_autogen_comment();
+  f_remote << indent() << "package main" << endl << endl;
+  f_remote << indent() << "import (" << endl;
+  f_remote << indent() << "        \"flag\"" << endl;
+  f_remote << indent() << "        \"fmt\"" << endl;
+  f_remote << indent() << "        \"math\"" << endl;
+  f_remote << indent() << "        \"net\"" << endl;
+  f_remote << indent() << "        \"net/url\"" << endl;
+  f_remote << indent() << "        \"os\"" << endl;
+  f_remote << indent() << "        \"strconv\"" << endl;
+  f_remote << indent() << "        \"strings\"" << endl;
+  f_remote << indent() << "        \"" + gen_thrift_import_ + "\"" << endl;
+  f_remote << indent() << "        \"" << service_module << "\"" << endl;
+  f_remote << indent() << ")" << endl;
+  f_remote << indent() << endl;
+  f_remote << indent() << "func Usage() {" << endl;
+  f_remote << indent() << "  fmt.Fprintln(os.Stderr, \"Usage of \", os.Args[0], \" "
+                          "[-h host:port] [-u url] [-f[ramed]] function [arg1 [arg2...]]:\")"
+           << endl;
+  f_remote << indent() << "  flag.PrintDefaults()" << endl;
+  f_remote << indent() << "  fmt.Fprintln(os.Stderr, \"\\nFunctions:\")" << endl;
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     f_remote << "  fmt.Fprintln(os.Stderr, \"  " << (*f_iter)->get_returntype()->get_name() << " "
@@ -1853,71 +1905,111 @@
     f_remote << ")\")" << endl;
   }
 
-  f_remote << indent() << "  fmt.Fprintln(os.Stderr)" << endl << indent() << "  os.Exit(0)" << endl
-           << indent() << "}" << endl << indent() << endl << indent() << "func main() {" << endl;
+  f_remote << indent() << "  fmt.Fprintln(os.Stderr)" << endl;
+  f_remote << indent() << "  os.Exit(0)" << endl;
+  f_remote << indent() << "}" << endl;
+  f_remote << indent() << endl;
+  f_remote << indent() << "func main() {" << endl;
   indent_up();
-  f_remote
-      << indent() << "flag.Usage = Usage" << endl << indent() << "var host string" << endl
-      << indent() << "var port int" << endl << indent() << "var protocol string" << endl << indent()
-      << "var urlString string" << endl << indent() << "var framed bool" << endl << indent()
-      << "var useHttp bool" << endl << indent() << "var parsedUrl url.URL" << endl << indent()
-      << "var trans thrift.TTransport" << endl << indent() << "_ = strconv.Atoi" << endl << indent()
-      << "_ = math.Abs" << endl << indent() << "flag.Usage = Usage" << endl << indent()
-      << "flag.StringVar(&host, \"h\", \"localhost\", \"Specify host and port\")" << endl
-      << indent() << "flag.IntVar(&port, \"p\", 9090, \"Specify port\")" << endl << indent()
-      << "flag.StringVar(&protocol, \"P\", \"binary\", \"Specify the protocol (binary, compact, "
-         "simplejson, json)\")" << endl << indent()
-      << "flag.StringVar(&urlString, \"u\", \"\", \"Specify the url\")" << endl << indent()
-      << "flag.BoolVar(&framed, \"framed\", false, \"Use framed transport\")" << endl << indent()
-      << "flag.BoolVar(&useHttp, \"http\", false, \"Use http\")" << endl << indent()
-      << "flag.Parse()" << endl << indent() << endl << indent() << "if len(urlString) > 0 {" << endl
-      << indent() << "  parsedUrl, err := url.Parse(urlString)" << endl << indent()
-      << "  if err != nil {" << endl << indent()
-      << "    fmt.Fprintln(os.Stderr, \"Error parsing URL: \", err)" << endl << indent()
-      << "    flag.Usage()" << endl << indent() << "  }" << endl << indent()
-      << "  host = parsedUrl.Host" << endl << indent()
-      << "  useHttp = len(parsedUrl.Scheme) <= 0 || parsedUrl.Scheme == \"http\"" << endl
-      << indent() << "} else if useHttp {" << endl << indent()
-      << "  _, err := url.Parse(fmt.Sprint(\"http://\", host, \":\", port))" << endl << indent()
-      << "  if err != nil {" << endl << indent()
-      << "    fmt.Fprintln(os.Stderr, \"Error parsing URL: \", err)" << endl << indent()
-      << "    flag.Usage()" << endl << indent() << "  }" << endl << indent() << "}" << endl
-      << indent() << endl << indent() << "cmd := flag.Arg(0)" << endl << indent() << "var err error"
-      << endl << indent() << "if useHttp {" << endl << indent()
-      << "  trans, err = thrift.NewTHttpClient(parsedUrl.String())" << endl << indent()
-      << "} else {" << endl << indent() << "  portStr := fmt.Sprint(port)" << endl << indent()
-      << "  if strings.Contains(host, \":\") {" << endl << indent()
-      << "         host, portStr, err = net.SplitHostPort(host)" << endl << indent()
-      << "         if err != nil {" << endl << indent()
-      << "                 fmt.Fprintln(os.Stderr, \"error with host:\", err)" << endl << indent()
-      << "                 os.Exit(1)" << endl << indent() << "         }" << endl << indent()
-      << "  }" << endl << indent()
-      << "  trans, err = thrift.NewTSocket(net.JoinHostPort(host, portStr))" << endl << indent()
-      << "  if err != nil {" << endl << indent()
-      << "    fmt.Fprintln(os.Stderr, \"error resolving address:\", err)" << endl << indent()
-      << "    os.Exit(1)" << endl << indent() << "  }" << endl << indent() << "  if framed {"
-      << endl << indent() << "    trans = thrift.NewTFramedTransport(trans)" << endl << indent()
-      << "  }" << endl << indent() << "}" << endl << indent() << "if err != nil {" << endl
-      << indent() << "  fmt.Fprintln(os.Stderr, \"Error creating transport\", err)" << endl
-      << indent() << "  os.Exit(1)" << endl << indent() << "}" << endl << indent()
-      << "defer trans.Close()" << endl << indent() << "var protocolFactory thrift.TProtocolFactory"
-      << endl << indent() << "switch protocol {" << endl << indent() << "case \"compact\":" << endl
-      << indent() << "  protocolFactory = thrift.NewTCompactProtocolFactory()" << endl << indent()
-      << "  break" << endl << indent() << "case \"simplejson\":" << endl << indent()
-      << "  protocolFactory = thrift.NewTSimpleJSONProtocolFactory()" << endl << indent()
-      << "  break" << endl << indent() << "case \"json\":" << endl << indent()
-      << "  protocolFactory = thrift.NewTJSONProtocolFactory()" << endl << indent() << "  break"
-      << endl << indent() << "case \"binary\", \"\":" << endl << indent()
-      << "  protocolFactory = thrift.NewTBinaryProtocolFactoryDefault()" << endl << indent()
-      << "  break" << endl << indent() << "default:" << endl << indent()
-      << "  fmt.Fprintln(os.Stderr, \"Invalid protocol specified: \", protocol)" << endl << indent()
-      << "  Usage()" << endl << indent() << "  os.Exit(1)" << endl << indent() << "}" << endl
-      << indent() << "client := " << package_name_ << ".New" << publicize(service_name_)
-      << "ClientFactory(trans, protocolFactory)" << endl << indent()
-      << "if err := trans.Open(); err != nil {" << endl << indent()
-      << "  fmt.Fprintln(os.Stderr, \"Error opening socket to \", host, \":\", port, \" \", err)"
-      << endl << indent() << "  os.Exit(1)" << endl << indent() << "}" << endl << indent() << endl
-      << indent() << "switch cmd {" << endl;
+  f_remote << indent() << "flag.Usage = Usage" << endl;
+  f_remote << indent() << "var host string" << endl;
+  f_remote << indent() << "var port int" << endl;
+  f_remote << indent() << "var protocol string" << endl;
+  f_remote << indent() << "var urlString string" << endl;
+  f_remote << indent() << "var framed bool" << endl;
+  f_remote << indent() << "var useHttp bool" << endl;
+  f_remote << indent() << "var parsedUrl url.URL" << endl;
+  f_remote << indent() << "var trans thrift.TTransport" << endl;
+  f_remote << indent() << "_ = strconv.Atoi" << endl;
+  f_remote << indent() << "_ = math.Abs" << endl;
+  f_remote << indent() << "flag.Usage = Usage" << endl;
+  f_remote << indent() << "flag.StringVar(&host, \"h\", \"localhost\", \"Specify host and port\")"
+           << endl;
+  f_remote << indent() << "flag.IntVar(&port, \"p\", 9090, \"Specify port\")" << endl;
+  f_remote << indent() << "flag.StringVar(&protocol, \"P\", \"binary\", \""
+                          "Specify the protocol (binary, compact, simplejson, json)\")" << endl;
+  f_remote << indent() << "flag.StringVar(&urlString, \"u\", \"\", \"Specify the url\")" << endl;
+  f_remote << indent() << "flag.BoolVar(&framed, \"framed\", false, \"Use framed transport\")"
+           << endl;
+  f_remote << indent() << "flag.BoolVar(&useHttp, \"http\", false, \"Use http\")" << endl;
+  f_remote << indent() << "flag.Parse()" << endl;
+  f_remote << indent() << endl;
+  f_remote << indent() << "if len(urlString) > 0 {" << endl;
+  f_remote << indent() << "  parsedUrl, err := url.Parse(urlString)" << endl;
+  f_remote << indent() << "  if err != nil {" << endl;
+  f_remote << indent() << "    fmt.Fprintln(os.Stderr, \"Error parsing URL: \", err)" << endl;
+  f_remote << indent() << "    flag.Usage()" << endl;
+  f_remote << indent() << "  }" << endl;
+  f_remote << indent() << "  host = parsedUrl.Host" << endl;
+  f_remote << indent() << "  useHttp = len(parsedUrl.Scheme) <= 0 || parsedUrl.Scheme == \"http\""
+           << endl;
+  f_remote << indent() << "} else if useHttp {" << endl;
+  f_remote << indent() << "  _, err := url.Parse(fmt.Sprint(\"http://\", host, \":\", port))"
+           << endl;
+  f_remote << indent() << "  if err != nil {" << endl;
+  f_remote << indent() << "    fmt.Fprintln(os.Stderr, \"Error parsing URL: \", err)" << endl;
+  f_remote << indent() << "    flag.Usage()" << endl;
+  f_remote << indent() << "  }" << endl;
+  f_remote << indent() << "}" << endl;
+  f_remote << indent() << endl;
+  f_remote << indent() << "cmd := flag.Arg(0)" << endl;
+  f_remote << indent() << "var err error" << endl;
+  f_remote << indent() << "if useHttp {" << endl;
+  f_remote << indent() << "  trans, err = thrift.NewTHttpClient(parsedUrl.String())" << endl;
+  f_remote << indent() << "} else {" << endl;
+  f_remote << indent() << "  portStr := fmt.Sprint(port)" << endl;
+  f_remote << indent() << "  if strings.Contains(host, \":\") {" << endl;
+  f_remote << indent() << "         host, portStr, err = net.SplitHostPort(host)" << endl;
+  f_remote << indent() << "         if err != nil {" << endl;
+  f_remote << indent() << "                 fmt.Fprintln(os.Stderr, \"error with host:\", err)"
+           << endl;
+  f_remote << indent() << "                 os.Exit(1)" << endl;
+  f_remote << indent() << "         }" << endl;
+  f_remote << indent() << "  }" << endl;
+  f_remote << indent() << "  trans, err = thrift.NewTSocket(net.JoinHostPort(host, portStr))"
+           << endl;
+  f_remote << indent() << "  if err != nil {" << endl;
+  f_remote << indent() << "    fmt.Fprintln(os.Stderr, \"error resolving address:\", err)" << endl;
+  f_remote << indent() << "    os.Exit(1)" << endl;
+  f_remote << indent() << "  }" << endl;
+  f_remote << indent() << "  if framed {" << endl;
+  f_remote << indent() << "    trans = thrift.NewTFramedTransport(trans)" << endl;
+  f_remote << indent() << "  }" << endl;
+  f_remote << indent() << "}" << endl;
+  f_remote << indent() << "if err != nil {" << endl;
+  f_remote << indent() << "  fmt.Fprintln(os.Stderr, \"Error creating transport\", err)" << endl;
+  f_remote << indent() << "  os.Exit(1)" << endl;
+  f_remote << indent() << "}" << endl;
+  f_remote << indent() << "defer trans.Close()" << endl;
+  f_remote << indent() << "var protocolFactory thrift.TProtocolFactory" << endl;
+  f_remote << indent() << "switch protocol {" << endl;
+  f_remote << indent() << "case \"compact\":" << endl;
+  f_remote << indent() << "  protocolFactory = thrift.NewTCompactProtocolFactory()" << endl;
+  f_remote << indent() << "  break" << endl;
+  f_remote << indent() << "case \"simplejson\":" << endl;
+  f_remote << indent() << "  protocolFactory = thrift.NewTSimpleJSONProtocolFactory()" << endl;
+  f_remote << indent() << "  break" << endl;
+  f_remote << indent() << "case \"json\":" << endl;
+  f_remote << indent() << "  protocolFactory = thrift.NewTJSONProtocolFactory()" << endl;
+  f_remote << indent() << "  break" << endl;
+  f_remote << indent() << "case \"binary\", \"\":" << endl;
+  f_remote << indent() << "  protocolFactory = thrift.NewTBinaryProtocolFactoryDefault()" << endl;
+  f_remote << indent() << "  break" << endl;
+  f_remote << indent() << "default:" << endl;
+  f_remote << indent() << "  fmt.Fprintln(os.Stderr, \"Invalid protocol specified: \", protocol)"
+           << endl;
+  f_remote << indent() << "  Usage()" << endl;
+  f_remote << indent() << "  os.Exit(1)" << endl;
+  f_remote << indent() << "}" << endl;
+  f_remote << indent() << "client := " << package_name_ << ".New" << publicize(service_name_)
+           << "ClientFactory(trans, protocolFactory)" << endl;
+  f_remote << indent() << "if err := trans.Open(); err != nil {" << endl;
+  f_remote << indent() << "  fmt.Fprintln(os.Stderr, \"Error opening socket to \", "
+                          "host, \":\", port, \" \", err)" << endl;
+  f_remote << indent() << "  os.Exit(1)" << endl;
+  f_remote << indent() << "}" << endl;
+  f_remote << indent() << endl;
+  f_remote << indent() << "switch cmd {" << endl;
 
   for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
     t_struct* arg_struct = (*f_iter)->get_arglist();
@@ -1929,10 +2021,11 @@
     string argumentsName(publicize(funcName + "_args", true));
     f_remote << indent() << "case \"" << escape_string(funcName) << "\":" << endl;
     indent_up();
-    f_remote << indent() << "if flag.NArg() - 1 != " << num_args << " {" << endl << indent()
-             << "  fmt.Fprintln(os.Stderr, \"" << escape_string(pubName) << " requires " << num_args
-             << " args\")" << endl << indent() << "  flag.Usage()" << endl << indent() << "}"
-             << endl;
+    f_remote << indent() << "if flag.NArg() - 1 != " << num_args << " {" << endl;
+    f_remote << indent() << "  fmt.Fprintln(os.Stderr, \"" << escape_string(pubName) << " requires "
+             << num_args << " args\")" << endl;
+    f_remote << indent() << "  flag.Usage()" << endl;
+    f_remote << indent() << "}" << endl;
 
     for (int i = 0; i < num_args; ++i) {
       int flagArg = i + 1;
@@ -1941,9 +2034,12 @@
 
       if (the_type2->is_enum()) {
         f_remote << indent() << "tmp" << i << ", err := (strconv.Atoi(flag.Arg(" << flagArg << ")))"
-                 << endl << indent() << "if err != nil {" << endl << indent() << "  Usage()" << endl
-                 << indent() << " return" << endl << indent() << "}" << endl << indent()
-                 << "argvalue" << i << " := " << package_name_ << "."
+                 << endl;
+        f_remote << indent() << "if err != nil {" << endl;
+        f_remote << indent() << "  Usage()" << endl;
+        f_remote << indent() << " return" << endl;
+        f_remote << indent() << "}" << endl;
+        f_remote << indent() << "argvalue" << i << " := " << package_name_ << "."
                  << publicize(the_type->get_name()) << "(tmp" << i << ")" << endl;
       } else if (the_type2->is_base_type()) {
         t_base_type::t_base e = ((t_base_type*)the_type2)->get_base();
@@ -1969,40 +2065,50 @@
 
         case t_base_type::TYPE_BYTE:
           f_remote << indent() << "tmp" << i << ", " << err << " := (strconv.Atoi(flag.Arg("
-                   << flagArg << ")))" << endl << indent() << "if " << err << " != nil {" << endl
-                   << indent() << "  Usage()" << endl << indent() << "  return" << endl << indent()
-                   << "}" << endl << indent() << "argvalue" << i << " := byte(tmp" << i << ")"
-                   << endl;
+                   << flagArg << ")))" << endl;
+          f_remote << indent() << "if " << err << " != nil {" << endl;
+          f_remote << indent() << "  Usage()" << endl;
+          f_remote << indent() << "  return" << endl;
+          f_remote << indent() << "}" << endl;
+          f_remote << indent() << "argvalue" << i << " := byte(tmp" << i << ")" << endl;
           break;
 
         case t_base_type::TYPE_I16:
           f_remote << indent() << "tmp" << i << ", " << err << " := (strconv.Atoi(flag.Arg("
-                   << flagArg << ")))" << endl << indent() << "if " << err << " != nil {" << endl
-                   << indent() << "  Usage()" << endl << indent() << "  return" << endl << indent()
-                   << "}" << endl << indent() << "argvalue" << i << " := byte(tmp" << i << ")"
-                   << endl;
+                   << flagArg << ")))" << endl;
+          f_remote << indent() << "if " << err << " != nil {" << endl;
+          f_remote << indent() << "  Usage()" << endl;
+          f_remote << indent() << "  return" << endl;
+          f_remote << indent() << "}" << endl;
+          f_remote << indent() << "argvalue" << i << " := byte(tmp" << i << ")" << endl;
           break;
 
         case t_base_type::TYPE_I32:
           f_remote << indent() << "tmp" << i << ", " << err << " := (strconv.Atoi(flag.Arg("
-                   << flagArg << ")))" << endl << indent() << "if " << err << " != nil {" << endl
-                   << indent() << "  Usage()" << endl << indent() << "  return" << endl << indent()
-                   << "}" << endl << indent() << "argvalue" << i << " := int32(tmp" << i << ")"
-                   << endl;
+                   << flagArg << ")))" << endl;
+          f_remote << indent() << "if " << err << " != nil {" << endl;
+          f_remote << indent() << "  Usage()" << endl;
+          f_remote << indent() << "  return" << endl;
+          f_remote << indent() << "}" << endl;
+          f_remote << indent() << "argvalue" << i << " := int32(tmp" << i << ")" << endl;
           break;
 
         case t_base_type::TYPE_I64:
           f_remote << indent() << "argvalue" << i << ", " << err
-                   << " := (strconv.ParseInt(flag.Arg(" << flagArg << "), 10, 64))" << endl
-                   << indent() << "if " << err << " != nil {" << endl << indent() << "  Usage()"
-                   << endl << indent() << "  return" << endl << indent() << "}" << endl;
+                   << " := (strconv.ParseInt(flag.Arg(" << flagArg << "), 10, 64))" << endl;
+          f_remote << indent() << "if " << err << " != nil {" << endl;
+          f_remote << indent() << "  Usage()" << endl;
+          f_remote << indent() << "  return" << endl;
+          f_remote << indent() << "}" << endl;
           break;
 
         case t_base_type::TYPE_DOUBLE:
           f_remote << indent() << "argvalue" << i << ", " << err
-                   << " := (strconv.ParseFloat(flag.Arg(" << flagArg << "), 64))" << endl
-                   << indent() << "if " << err << " != nil {" << endl << indent() << "  Usage()"
-                   << endl << indent() << "  return" << endl << indent() << "}" << endl;
+                   << " := (strconv.ParseFloat(flag.Arg(" << flagArg << "), 64))" << endl;
+          f_remote << indent() << "if " << err << " != nil {" << endl;
+          f_remote << indent() << "  Usage()" << endl;
+          f_remote << indent() << "  return" << endl;
+          f_remote << indent() << "}" << endl;
           break;
 
         default:
@@ -2019,19 +2125,26 @@
         string jsProt(tmp("jsProt"));
         string err2(tmp("err"));
         std::string tstruct_name(publicize(the_type->get_name()));
-        f_remote << indent() << arg << " := flag.Arg(" << flagArg << ")" << endl << indent()
-                 << mbTrans << " := thrift.NewTMemoryBufferLen(len(" << arg << "))" << endl
-                 << indent() << "defer " << mbTrans << ".Close()" << endl << indent() << "_, "
-                 << err1 << " := " << mbTrans << ".WriteString(" << arg << ")" << endl << indent()
-                 << "if " << err1 << " != nil {" << endl << indent() << "  Usage()" << endl
-                 << indent() << "  return" << endl << indent() << "}" << endl << indent() << factory
-                 << " := thrift.NewTSimpleJSONProtocolFactory()" << endl << indent() << jsProt
-                 << " := " << factory << ".GetProtocol(" << mbTrans << ")" << endl << indent()
-                 << "argvalue" << i << " := " << package_name_ << ".New" << tstruct_name << "()"
-                 << endl << indent() << err2 << " := argvalue" << i << ".Read(" << jsProt << ")"
-                 << endl << indent() << "if " << err2 << " != nil {" << endl << indent()
-                 << "  Usage()" << endl << indent() << "  return" << endl << indent() << "}"
+        f_remote << indent() << arg << " := flag.Arg(" << flagArg << ")" << endl;
+        f_remote << indent() << mbTrans << " := thrift.NewTMemoryBufferLen(len(" << arg << "))"
                  << endl;
+        f_remote << indent() << "defer " << mbTrans << ".Close()" << endl;
+        f_remote << indent() << "_, " << err1 << " := " << mbTrans << ".WriteString(" << arg << ")"
+                 << endl;
+        f_remote << indent() << "if " << err1 << " != nil {" << endl;
+        f_remote << indent() << "  Usage()" << endl;
+        f_remote << indent() << "  return" << endl;
+        f_remote << indent() << "}" << endl;
+        f_remote << indent() << factory << " := thrift.NewTSimpleJSONProtocolFactory()" << endl;
+        f_remote << indent() << jsProt << " := " << factory << ".GetProtocol(" << mbTrans << ")"
+                 << endl;
+        f_remote << indent() << "argvalue" << i << " := " << package_name_ << ".New" << tstruct_name
+                 << "()" << endl;
+        f_remote << indent() << err2 << " := argvalue" << i << ".Read(" << jsProt << ")" << endl;
+        f_remote << indent() << "if " << err2 << " != nil {" << endl;
+        f_remote << indent() << "  Usage()" << endl;
+        f_remote << indent() << "  return" << endl;
+        f_remote << indent() << "}" << endl;
       } else if (the_type2->is_container() || the_type2->is_xception()) {
         string arg(tmp("arg"));
         string mbTrans(tmp("mbTrans"));
@@ -2040,20 +2153,29 @@
         string jsProt(tmp("jsProt"));
         string err2(tmp("err"));
         std::string argName(publicize(args[i]->get_name()));
-        f_remote << indent() << arg << " := flag.Arg(" << flagArg << ")" << endl << indent()
-                 << mbTrans << " := thrift.NewTMemoryBufferLen(len(" << arg << "))" << endl
-                 << indent() << "defer " << mbTrans << ".Close()" << endl << indent() << "_, "
-                 << err1 << " := " << mbTrans << ".WriteString(" << arg << ")" << endl << indent()
-                 << "if " << err1 << " != nil { " << endl << indent() << "  Usage()" << endl
-                 << indent() << "  return" << endl << indent() << "}" << endl << indent() << factory
-                 << " := thrift.NewTSimpleJSONProtocolFactory()" << endl << indent() << jsProt
-                 << " := " << factory << ".GetProtocol(" << mbTrans << ")" << endl << indent()
-                 << "containerStruct" << i << " := " << package_name_ << ".New" << argumentsName
-                 << "()" << endl << indent() << err2 << " := containerStruct" << i << ".ReadField"
-                 << (i + 1) << "(" << jsProt << ")" << endl << indent() << "if " << err2
-                 << " != nil {" << endl << indent() << "  Usage()" << endl << indent() << "  return"
-                 << endl << indent() << "}" << endl << indent() << "argvalue" << i
-                 << " := containerStruct" << i << "." << argName << endl;
+        f_remote << indent() << arg << " := flag.Arg(" << flagArg << ")" << endl;
+        f_remote << indent() << mbTrans << " := thrift.NewTMemoryBufferLen(len(" << arg << "))"
+                 << endl;
+        f_remote << indent() << "defer " << mbTrans << ".Close()" << endl;
+        f_remote << indent() << "_, " << err1 << " := " << mbTrans << ".WriteString(" << arg << ")"
+                 << endl;
+        f_remote << indent() << "if " << err1 << " != nil { " << endl;
+        f_remote << indent() << "  Usage()" << endl;
+        f_remote << indent() << "  return" << endl;
+        f_remote << indent() << "}" << endl;
+        f_remote << indent() << factory << " := thrift.NewTSimpleJSONProtocolFactory()" << endl;
+        f_remote << indent() << jsProt << " := " << factory << ".GetProtocol(" << mbTrans << ")"
+                 << endl;
+        f_remote << indent() << "containerStruct" << i << " := " << package_name_ << ".New"
+                 << argumentsName << "()" << endl;
+        f_remote << indent() << err2 << " := containerStruct" << i << ".ReadField" << (i + 1) << "("
+                 << jsProt << ")" << endl;
+        f_remote << indent() << "if " << err2 << " != nil {" << endl;
+        f_remote << indent() << "  Usage()" << endl;
+        f_remote << indent() << "  return" << endl;
+        f_remote << indent() << "}" << endl;
+        f_remote << indent() << "argvalue" << i << " := containerStruct" << i << "." << argName
+                 << endl;
       } else {
         throw("Invalid argument type in generate_service_remote");
       }
@@ -2106,15 +2228,18 @@
       }
     }
 
-    f_remote << "))" << endl << indent() << "fmt.Print(\"\\n\")" << endl << indent() << "break"
-             << endl;
+    f_remote << "))" << endl;
+    f_remote << indent() << "fmt.Print(\"\\n\")" << endl;
+    f_remote << indent() << "break" << endl;
     indent_down();
   }
 
-  f_remote << indent() << "case \"\":" << endl << indent() << "  Usage()" << endl << indent()
-           << "  break" << endl << indent() << "default:" << endl << indent()
-           << "  fmt.Fprintln(os.Stderr, \"Invalid function \", cmd)" << endl << indent() << "}"
-           << endl;
+  f_remote << indent() << "case \"\":" << endl;
+  f_remote << indent() << "  Usage()" << endl;
+  f_remote << indent() << "  break" << endl;
+  f_remote << indent() << "default:" << endl;
+  f_remote << indent() << "  fmt.Fprintln(os.Stderr, \"Invalid function \", cmd)" << endl;
+  f_remote << indent() << "}" << endl;
   indent_down();
   f_remote << indent() << "}" << endl;
   // Close service file
@@ -2165,22 +2290,29 @@
   string self(tmp("self"));
 
   if (extends_processor.empty()) {
+    f_service_ << indent() << "type " << serviceName << "Processor struct {" << endl;
+    f_service_ << indent() << "  processorMap map[string]thrift.TProcessorFunction" << endl;
+    f_service_ << indent() << "  handler " << serviceName << endl;
+    f_service_ << indent() << "}" << endl << endl;
+    f_service_ << indent() << "func (p *" << serviceName
+               << "Processor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {"
+               << endl;
+    f_service_ << indent() << "  p.processorMap[key] = processor" << endl;
+    f_service_ << indent() << "}" << endl << endl;
+    f_service_ << indent() << "func (p *" << serviceName
+               << "Processor) GetProcessorFunction(key string) "
+                  "(processor thrift.TProcessorFunction, ok bool) {" << endl;
+    f_service_ << indent() << "  processor, ok = p.processorMap[key]" << endl;
+    f_service_ << indent() << "  return processor, ok" << endl;
+    f_service_ << indent() << "}" << endl << endl;
+    f_service_ << indent() << "func (p *" << serviceName
+               << "Processor) ProcessorMap() map[string]thrift.TProcessorFunction {" << endl;
+    f_service_ << indent() << "  return p.processorMap" << endl;
+    f_service_ << indent() << "}" << endl << endl;
+    f_service_ << indent() << "func New" << serviceName << "Processor(handler " << serviceName
+               << ") *" << serviceName << "Processor {" << endl << endl;
     f_service_
-        << indent() << "type " << serviceName << "Processor struct {" << endl << indent()
-        << "  processorMap map[string]thrift.TProcessorFunction" << endl << indent() << "  handler "
-        << serviceName << endl << indent() << "}" << endl << endl << indent() << "func (p *"
-        << serviceName
-        << "Processor) AddToProcessorMap(key string, processor thrift.TProcessorFunction) {" << endl
-        << indent() << "  p.processorMap[key] = processor" << endl << indent() << "}" << endl
-        << endl << indent() << "func (p *" << serviceName
-        << "Processor) GetProcessorFunction(key string) (processor thrift.TProcessorFunction, ok "
-           "bool) {" << endl << indent() << "  processor, ok = p.processorMap[key]" << endl
-        << indent() << "  return processor, ok" << endl << indent() << "}" << endl << endl
-        << indent() << "func (p *" << serviceName
-        << "Processor) ProcessorMap() map[string]thrift.TProcessorFunction {" << endl << indent()
-        << "  return p.processorMap" << endl << indent() << "}" << endl << endl << indent()
-        << "func New" << serviceName << "Processor(handler " << serviceName << ") *" << serviceName
-        << "Processor {" << endl << endl << indent() << "  " << self << " := &" << serviceName
+        << indent() << "  " << self << " := &" << serviceName
         << "Processor{handler:handler, processorMap:make(map[string]thrift.TProcessorFunction)}"
         << endl;
 
@@ -2192,28 +2324,36 @@
     }
 
     string x(tmp("x"));
-    f_service_ << indent() << "return " << self << endl << indent() << "}" << endl << endl
-               << indent() << "func (p *" << serviceName
+    f_service_ << indent() << "return " << self << endl;
+    f_service_ << indent() << "}" << endl << endl;
+    f_service_ << indent() << "func (p *" << serviceName
                << "Processor) Process(iprot, oprot thrift.TProtocol) (success bool, err "
-                  "thrift.TException) {" << endl << indent()
-               << "  name, _, seqId, err := iprot.ReadMessageBegin()" << endl << indent()
-               << "  if err != nil { return false, err }" << endl << indent()
-               << "  if processor, ok := p.GetProcessorFunction(name); ok {" << endl << indent()
-               << "    return processor.Process(seqId, iprot, oprot)" << endl << indent() << "  }"
-               << endl << indent() << "  iprot.Skip(thrift.STRUCT)" << endl << indent()
-               << "  iprot.ReadMessageEnd()" << endl << indent() << "  " << x
+                  "thrift.TException) {" << endl;
+    f_service_ << indent() << "  name, _, seqId, err := iprot.ReadMessageBegin()" << endl;
+    f_service_ << indent() << "  if err != nil { return false, err }" << endl;
+    f_service_ << indent() << "  if processor, ok := p.GetProcessorFunction(name); ok {" << endl;
+    f_service_ << indent() << "    return processor.Process(seqId, iprot, oprot)" << endl;
+    f_service_ << indent() << "  }" << endl;
+    f_service_ << indent() << "  iprot.Skip(thrift.STRUCT)" << endl;
+    f_service_ << indent() << "  iprot.ReadMessageEnd()" << endl;
+    f_service_ << indent() << "  " << x
                << " := thrift.NewTApplicationException(thrift.UNKNOWN_METHOD, \"Unknown function "
-                  "\" + name)" << endl << indent()
-               << "  oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)" << endl << indent()
-               << "  " << x << ".Write(oprot)" << endl << indent() << "  oprot.WriteMessageEnd()"
-               << endl << indent() << "  oprot.Flush()" << endl << indent() << "  return false, "
-               << x << endl << indent() << "" << endl << indent() << "}" << endl << endl;
+                  "\" + name)" << endl;
+    f_service_ << indent() << "  oprot.WriteMessageBegin(name, thrift.EXCEPTION, seqId)" << endl;
+    f_service_ << indent() << "  " << x << ".Write(oprot)" << endl;
+    f_service_ << indent() << "  oprot.WriteMessageEnd()" << endl;
+    f_service_ << indent() << "  oprot.Flush()" << endl;
+    f_service_ << indent() << "  return false, " << x << endl;
+    f_service_ << indent() << "" << endl;
+    f_service_ << indent() << "}" << endl << endl;
   } else {
-    f_service_ << indent() << "type " << serviceName << "Processor struct {" << endl << indent()
-               << "  *" << extends_processor << endl << indent() << "}" << endl << endl << indent()
-               << "func New" << serviceName << "Processor(handler " << serviceName << ") *"
-               << serviceName << "Processor {" << endl << indent() << "  " << self << " := &"
-               << serviceName << "Processor{" << extends_processor_new << "(handler)}" << endl;
+    f_service_ << indent() << "type " << serviceName << "Processor struct {" << endl;
+    f_service_ << indent() << "  *" << extends_processor << endl;
+    f_service_ << indent() << "}" << endl << endl;
+    f_service_ << indent() << "func New" << serviceName << "Processor(handler " << serviceName
+               << ") *" << serviceName << "Processor {" << endl;
+    f_service_ << indent() << "  " << self << " := &" << serviceName << "Processor{"
+               << extends_processor_new << "(handler)}" << endl;
 
     for (f_iter = functions.begin(); f_iter != functions.end(); ++f_iter) {
       string escapedFuncName(escape_string((*f_iter)->get_name()));
@@ -2222,7 +2362,8 @@
                  << "{handler:handler})" << endl;
     }
 
-    f_service_ << indent() << "  return " << self << endl << indent() << "}" << endl << endl;
+    f_service_ << indent() << "  return " << self << endl;
+    f_service_ << indent() << "}" << endl << endl;
   }
 
   // Generate the process subfunctions
@@ -2247,25 +2388,29 @@
   // t_struct* xs = tfunction->get_xceptions();
   // const std::vector<t_field*>& xceptions = xs->get_members();
   vector<t_field*>::const_iterator x_iter;
-  f_service_ << indent() << "type " << processorName << " struct {" << endl << indent()
-             << "  handler " << publicize(tservice->get_name()) << endl << indent() << "}" << endl
-             << endl << indent() << "func (p *" << processorName
+  f_service_ << indent() << "type " << processorName << " struct {" << endl;
+  f_service_ << indent() << "  handler " << publicize(tservice->get_name()) << endl;
+  f_service_ << indent() << "}" << endl << endl;
+  f_service_ << indent() << "func (p *" << processorName
              << ") Process(seqId int32, iprot, oprot thrift.TProtocol) (success bool, err "
                 "thrift.TException) {" << endl;
   indent_up();
-  f_service_ << indent() << "args := " << argsname << "{}" << endl << indent()
-             << "if err = args.Read(iprot); err != nil {" << endl << indent()
-             << "  iprot.ReadMessageEnd()" << endl;
+  f_service_ << indent() << "args := " << argsname << "{}" << endl;
+  f_service_ << indent() << "if err = args.Read(iprot); err != nil {" << endl;
+  f_service_ << indent() << "  iprot.ReadMessageEnd()" << endl;
   if (!tfunction->is_oneway()) {
     f_service_ << indent()
                << "  x := thrift.NewTApplicationException(thrift.PROTOCOL_ERROR, err.Error())"
-               << endl << indent() << "  oprot.WriteMessageBegin(\""
-               << escape_string(tfunction->get_name()) << "\", thrift.EXCEPTION, seqId)" << endl
-               << indent() << "  x.Write(oprot)" << endl << indent() << "  oprot.WriteMessageEnd()"
-               << endl << indent() << "  oprot.Flush()" << endl;
+               << endl;
+    f_service_ << indent() << "  oprot.WriteMessageBegin(\"" << escape_string(tfunction->get_name())
+               << "\", thrift.EXCEPTION, seqId)" << endl;
+    f_service_ << indent() << "  x.Write(oprot)" << endl;
+    f_service_ << indent() << "  oprot.WriteMessageEnd()" << endl;
+    f_service_ << indent() << "  oprot.Flush()" << endl;
   }
-  f_service_ << indent() << "  return false, err" << endl << indent() << "}" << endl << endl
-             << indent() << "iprot.ReadMessageEnd()" << endl;
+  f_service_ << indent() << "  return false, err" << endl;
+  f_service_ << indent() << "}" << endl << endl;
+  f_service_ << indent() << "iprot.ReadMessageEnd()" << endl;
 
   if (!tfunction->is_oneway()) {
     f_service_ << indent() << "result := " << resultname << "{}" << endl;
@@ -2275,7 +2420,8 @@
     f_service_ << "var retval " << type_to_go_type(tfunction->get_returntype()) << endl;
   }
 
-  f_service_ << indent() << "var err2 error" << endl << indent() << "if ";
+  f_service_ << indent() << "var err2 error" << endl;
+  f_service_ << indent() << "if ";
 
   if (!tfunction->is_oneway()) {
     if (!tfunction->get_returntype()->is_void()) {
@@ -2311,7 +2457,8 @@
 
     for (xf_iter = x_fields.begin(); xf_iter != x_fields.end(); ++xf_iter) {
       f_service_ << indent() << "  case " << type_to_go_type(((*xf_iter)->get_type())) << ":"
-                 << endl << indent() << "result."
+                 << endl;
+      f_service_ << indent() << "result."
                  << publicize(variable_name_to_go_name((*xf_iter)->get_name())) << " = v" << endl;
     }
 
@@ -2321,10 +2468,12 @@
   if (!tfunction->is_oneway()) {
     f_service_ << indent() << "  x := thrift.NewTApplicationException(thrift.INTERNAL_ERROR, "
                               "\"Internal error processing " << escape_string(tfunction->get_name())
-               << ": \" + err2.Error())" << endl << indent() << "  oprot.WriteMessageBegin(\""
-               << escape_string(tfunction->get_name()) << "\", thrift.EXCEPTION, seqId)" << endl
-               << indent() << "  x.Write(oprot)" << endl << indent() << "  oprot.WriteMessageEnd()"
-               << endl << indent() << "  oprot.Flush()" << endl;
+               << ": \" + err2.Error())" << endl;
+    f_service_ << indent() << "  oprot.WriteMessageBegin(\"" << escape_string(tfunction->get_name())
+               << "\", thrift.EXCEPTION, seqId)" << endl;
+    f_service_ << indent() << "  x.Write(oprot)" << endl;
+    f_service_ << indent() << "  oprot.WriteMessageEnd()" << endl;
+    f_service_ << indent() << "  oprot.Flush()" << endl;
   }
 
   f_service_ << indent() << "  return true, err2" << endl;
@@ -2351,17 +2500,26 @@
     }
     f_service_ << indent() << "if err2 = oprot.WriteMessageBegin(\""
                << escape_string(tfunction->get_name()) << "\", thrift.REPLY, seqId); err2 != nil {"
-               << endl << indent() << "  err = err2" << endl << indent() << "}" << endl << indent()
-               << "if err2 = result.Write(oprot); err == nil && err2 != nil {" << endl << indent()
-               << "  err = err2" << endl << indent() << "}" << endl << indent()
-               << "if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {" << endl
-               << indent() << "  err = err2" << endl << indent() << "}" << endl << indent()
-               << "if err2 = oprot.Flush(); err == nil && err2 != nil {" << endl << indent()
-               << "  err = err2" << endl << indent() << "}" << endl << indent() << "if err != nil {"
-               << endl << indent() << "  return" << endl << indent() << "}" << endl << indent()
-               << "return true, err" << endl;
+               << endl;
+    f_service_ << indent() << "  err = err2" << endl;
+    f_service_ << indent() << "}" << endl;
+    f_service_ << indent() << "if err2 = result.Write(oprot); err == nil && err2 != nil {" << endl;
+    f_service_ << indent() << "  err = err2" << endl;
+    f_service_ << indent() << "}" << endl;
+    f_service_ << indent() << "if err2 = oprot.WriteMessageEnd(); err == nil && err2 != nil {"
+               << endl;
+    f_service_ << indent() << "  err = err2" << endl;
+    f_service_ << indent() << "}" << endl;
+    f_service_ << indent() << "if err2 = oprot.Flush(); err == nil && err2 != nil {" << endl;
+    f_service_ << indent() << "  err = err2" << endl;
+    f_service_ << indent() << "}" << endl;
+    f_service_ << indent() << "if err != nil {" << endl;
+    f_service_ << indent() << "  return" << endl;
+    f_service_ << indent() << "}" << endl;
+    f_service_ << indent() << "return true, err" << endl;
   } else {
-    f_service_ << endl << indent() << "return true, nil" << endl;
+    f_service_ << endl;
+    f_service_ << indent() << "return true, nil" << endl;
   }
   indent_down();
   f_service_ << indent() << "}" << endl << endl;
@@ -2454,9 +2612,9 @@
       out << "ReadI32()";
     }
 
-    out << "; err != nil {" << endl << indent()
-        << "return thrift.PrependError(\"error reading field " << tfield->get_key() << ": \", err)"
-        << endl;
+    out << "; err != nil {" << endl;
+    out << indent() << "return thrift.PrependError(\"error reading field " << tfield->get_key()
+        << ": \", err)" << endl;
 
     out << "} else {" << endl;
     string wrap;
@@ -2494,9 +2652,10 @@
 
   out << indent() << prefix << eq << (pointer_field ? "&" : "");
   generate_go_struct_initializer(out, tstruct);
-  out << indent() << "if err := " << prefix << ".Read(iprot); err != nil {" << endl << indent()
-      << "  return thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", " << prefix
-      << "), err)" << endl << indent() << "}" << endl;
+  out << indent() << "if err := " << prefix << ".Read(iprot); err != nil {" << endl;
+  out << indent() << "  return thrift.PrependError(fmt.Sprintf(\"%T error reading struct: \", "
+      << prefix << "), err)" << endl;
+  out << indent() << "}" << endl;
 }
 
 /**
@@ -2517,26 +2676,28 @@
 
   // Declare variables, read header
   if (ttype->is_map()) {
-    out << indent() << "_, _, size, err := iprot.ReadMapBegin()" << endl << indent()
-        << "if err != nil {" << endl << indent()
-        << "  return thrift.PrependError(\"error reading map begin: \", err)" << endl << indent()
-        << "}" << endl << indent() << "tMap := make(" << type_to_go_type(orig_type) << ", size)"
-        << endl << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tMap" << endl;
+    out << indent() << "_, _, size, err := iprot.ReadMapBegin()" << endl;
+    out << indent() << "if err != nil {" << endl;
+    out << indent() << "  return thrift.PrependError(\"error reading map begin: \", err)" << endl;
+    out << indent() << "}" << endl;
+    out << indent() << "tMap := make(" << type_to_go_type(orig_type) << ", size)" << endl;
+    out << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tMap" << endl;
   } else if (ttype->is_set()) {
     t_set* t = (t_set*)ttype;
-    out << indent() << "_, size, err := iprot.ReadSetBegin()" << endl << indent()
-        << "if err != nil {" << endl << indent()
-        << "  return thrift.PrependError(\"error reading set begin: \", err)" << endl << indent()
-        << "}" << endl << indent() << "tSet := make(map["
-        << type_to_go_key_type(t->get_elem_type()->get_true_type()) << "]bool, size)" << endl
-        << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tSet" << endl;
+    out << indent() << "_, size, err := iprot.ReadSetBegin()" << endl;
+    out << indent() << "if err != nil {" << endl;
+    out << indent() << "  return thrift.PrependError(\"error reading set begin: \", err)" << endl;
+    out << indent() << "}" << endl;
+    out << indent() << "tSet := make(map["
+        << type_to_go_key_type(t->get_elem_type()->get_true_type()) << "]bool, size)" << endl;
+    out << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tSet" << endl;
   } else if (ttype->is_list()) {
-    out << indent() << "_, size, err := iprot.ReadListBegin()" << endl << indent()
-        << "if err != nil {" << endl << indent()
-        << "  return thrift.PrependError(\"error reading list begin: \", err)" << endl << indent()
-        << "}" << endl << indent() << "tSlice := make(" << type_to_go_type(orig_type)
-        << ", 0, size)" << endl << indent() << prefix << eq << " " << (pointer_field ? "&" : "")
-        << "tSlice" << endl;
+    out << indent() << "_, size, err := iprot.ReadListBegin()" << endl;
+    out << indent() << "if err != nil {" << endl;
+    out << indent() << "  return thrift.PrependError(\"error reading list begin: \", err)" << endl;
+    out << indent() << "}" << endl;
+    out << indent() << "tSlice := make(" << type_to_go_type(orig_type) << ", 0, size)" << endl;
+    out << indent() << prefix << eq << " " << (pointer_field ? "&" : "") << "tSlice" << endl;
   } else {
     throw "INVALID TYPE IN generate_deserialize_container '" + ttype->get_name() + "' for prefix '"
         + prefix + "'";
@@ -2562,17 +2723,17 @@
 
   // Read container end
   if (ttype->is_map()) {
-    out << indent() << "if err := iprot.ReadMapEnd(); err != nil {" << endl << indent()
-        << "  return thrift.PrependError(\"error reading map end: \", err)" << endl << indent()
-        << "}" << endl;
+    out << indent() << "if err := iprot.ReadMapEnd(); err != nil {" << endl;
+    out << indent() << "  return thrift.PrependError(\"error reading map end: \", err)" << endl;
+    out << indent() << "}" << endl;
   } else if (ttype->is_set()) {
-    out << indent() << "if err := iprot.ReadSetEnd(); err != nil {" << endl << indent()
-        << "  return thrift.PrependError(\"error reading set end: \", err)" << endl << indent()
-        << "}" << endl;
+    out << indent() << "if err := iprot.ReadSetEnd(); err != nil {" << endl;
+    out << indent() << "  return thrift.PrependError(\"error reading set end: \", err)" << endl;
+    out << indent() << "}" << endl;
   } else if (ttype->is_list()) {
-    out << indent() << "if err := iprot.ReadListEnd(); err != nil {" << endl << indent()
-        << "  return thrift.PrependError(\"error reading list end: \", err)" << endl << indent()
-        << "}" << endl;
+    out << indent() << "if err := iprot.ReadListEnd(); err != nil {" << endl;
+    out << indent() << "  return thrift.PrependError(\"error reading list end: \", err)" << endl;
+    out << indent() << "}" << endl;
   }
 }
 
@@ -2702,7 +2863,8 @@
       out << "WriteI32(int32(" << name << "))";
     }
 
-    out << "; err != nil {" << endl << indent() << "return thrift.PrependError(fmt.Sprintf(\"%T."
+    out << "; err != nil {" << endl;
+    out << indent() << "return thrift.PrependError(fmt.Sprintf(\"%T."
         << escape_string(tfield->get_name()) << " (" << tfield->get_key()
         << ") field write error: \", p), err) }" << endl;
   } else {
@@ -2719,9 +2881,10 @@
  */
 void t_go_generator::generate_serialize_struct(ofstream& out, t_struct* tstruct, string prefix) {
   (void)tstruct;
-  out << indent() << "if err := " << prefix << ".Write(oprot); err != nil {" << endl << indent()
-      << "  return thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", " << prefix
-      << "), err)" << endl << indent() << "}" << endl;
+  out << indent() << "if err := " << prefix << ".Write(oprot); err != nil {" << endl;
+  out << indent() << "  return thrift.PrependError(fmt.Sprintf(\"%T error writing struct: \", "
+      << prefix << "), err)" << endl;
+  out << indent() << "}" << endl;
 }
 
 void t_go_generator::generate_serialize_container(ofstream& out,
@@ -2735,21 +2898,21 @@
     out << indent() << "if err := oprot.WriteMapBegin("
         << type_to_enum(((t_map*)ttype)->get_key_type()) << ", "
         << type_to_enum(((t_map*)ttype)->get_val_type()) << ", "
-        << "len(" << prefix << ")); err != nil {" << endl << indent()
-        << "  return thrift.PrependError(\"error writing map begin: \", err)" << endl << indent()
-        << "}" << endl;
+        << "len(" << prefix << ")); err != nil {" << endl;
+    out << indent() << "  return thrift.PrependError(\"error writing map begin: \", err)" << endl;
+    out << indent() << "}" << endl;
   } else if (ttype->is_set()) {
     out << indent() << "if err := oprot.WriteSetBegin("
         << type_to_enum(((t_set*)ttype)->get_elem_type()) << ", "
-        << "len(" << prefix << ")); err != nil {" << endl << indent()
-        << "  return thrift.PrependError(\"error writing set begin: \", err)" << endl << indent()
-        << "}" << endl;
+        << "len(" << prefix << ")); err != nil {" << endl;
+    out << indent() << "  return thrift.PrependError(\"error writing set begin: \", err)" << endl;
+    out << indent() << "}" << endl;
   } else if (ttype->is_list()) {
     out << indent() << "if err := oprot.WriteListBegin("
         << type_to_enum(((t_list*)ttype)->get_elem_type()) << ", "
-        << "len(" << prefix << ")); err != nil {" << endl << indent()
-        << "  return thrift.PrependError(\"error writing list begin: \", err)" << endl << indent()
-        << "}" << endl;
+        << "len(" << prefix << ")); err != nil {" << endl;
+    out << indent() << "  return thrift.PrependError(\"error writing list begin: \", err)" << endl;
+    out << indent() << "}" << endl;
   } else {
     throw "compiler error: Invalid type in generate_serialize_container '" + ttype->get_name()
         + "' for prefix '" + prefix + "'";
@@ -2780,17 +2943,17 @@
   }
 
   if (ttype->is_map()) {
-    out << indent() << "if err := oprot.WriteMapEnd(); err != nil {" << endl << indent()
-        << "  return thrift.PrependError(\"error writing map end: \", err)" << endl << indent()
-        << "}" << endl;
+    out << indent() << "if err := oprot.WriteMapEnd(); err != nil {" << endl;
+    out << indent() << "  return thrift.PrependError(\"error writing map end: \", err)" << endl;
+    out << indent() << "}" << endl;
   } else if (ttype->is_set()) {
-    out << indent() << "if err := oprot.WriteSetEnd(); err != nil {" << endl << indent()
-        << "  return thrift.PrependError(\"error writing set end: \", err)" << endl << indent()
-        << "}" << endl;
+    out << indent() << "if err := oprot.WriteSetEnd(); err != nil {" << endl;
+    out << indent() << "  return thrift.PrependError(\"error writing set end: \", err)" << endl;
+    out << indent() << "}" << endl;
   } else if (ttype->is_list()) {
-    out << indent() << "if err := oprot.WriteListEnd(); err != nil {" << endl << indent()
-        << "  return thrift.PrependError(\"error writing list end: \", err)" << endl << indent()
-        << "}" << endl;
+    out << indent() << "if err := oprot.WriteListEnd(); err != nil {" << endl;
+    out << indent() << "  return thrift.PrependError(\"error writing list end: \", err)" << endl;
+    out << indent() << "}" << endl;
   }
 }