diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.cc b/compiler/cpp/src/thrift/generate/t_go_generator.cc index 9e1865f95e..49415cb12a 100644 --- a/compiler/cpp/src/thrift/generate/t_go_generator.cc +++ b/compiler/cpp/src/thrift/generate/t_go_generator.cc @@ -1425,8 +1425,15 @@ void t_go_generator::generate_go_struct_definition(ostream& out, out << indent() << "return \"\"" << '\n'; indent_down(); out << indent() << "}" << '\n'; - out << indent() << "return fmt.Sprintf(\"" << escape_string(tstruct_name) << "(%+v)\", *p)" - << '\n'; + if (stringer_mode_ == STRINGER_MODE_FMT) { + out << indent() << "return fmt.Sprintf(\"" << escape_string(tstruct_name) << "(%+v)\", *p)" + << '\n'; + } else if (stringer_mode_ == STRINGER_MODE_JSON) { + out << indent() << "v, _ := json.Marshal(p)" << '\n'; + out << indent() << "return \"" << escape_string(tstruct_name) << "\" + string(v)" << '\n'; + } else { + throw "invalid stringer mode: " + stringer_mode_; + } indent_down(); out << indent() << "}" << '\n' << '\n'; @@ -4397,4 +4404,6 @@ THRIFT_REGISTER_GENERATOR(go, "Go", " read_write_private\n" " Make read/write methods private, default is public Read/Write\n" " skip_remote\n" - " Skip the generating of -remote folders for the client binaries for services\n") + " Skip the generating of -remote folders for the client binaries for services\n" + " stringer_mode=\n" + " Stringer implementation mode: " + STRINGER_MODE_FMT + ", " + STRINGER_MODE_JSON + ". Default:" + STRINGER_MODE_DEFAULT + "\n") diff --git a/compiler/cpp/src/thrift/generate/t_go_generator.h b/compiler/cpp/src/thrift/generate/t_go_generator.h index 72825bc9ca..251a0b33e7 100644 --- a/compiler/cpp/src/thrift/generate/t_go_generator.h +++ b/compiler/cpp/src/thrift/generate/t_go_generator.h @@ -46,6 +46,9 @@ using std::vector; const string DEFAULT_THRIFT_IMPORT = "github.com/apache/thrift/lib/go/thrift"; static std::string package_flag; +const string STRINGER_MODE_FMT = "fmt"; +const string STRINGER_MODE_JSON = "json"; +const string STRINGER_MODE_DEFAULT = STRINGER_MODE_FMT; /** * Go code generator. @@ -65,6 +68,7 @@ class t_go_generator : public t_generator { read_write_private_ = false; ignore_initialisms_ = false; skip_remote_ = false; + stringer_mode_ = STRINGER_MODE_DEFAULT; for (iter = parsed_options.begin(); iter != parsed_options.end(); ++iter) { if (iter->first.compare("package_prefix") == 0) { gen_package_prefix_ = (iter->second); @@ -78,6 +82,12 @@ class t_go_generator : public t_generator { ignore_initialisms_ = true; } else if( iter->first.compare("skip_remote") == 0) { skip_remote_ = true; + } else if (iter->first.compare("stringer_mode") == 0) { + if (iter->second.compare(STRINGER_MODE_FMT) != 0 && + iter->second.compare(STRINGER_MODE_JSON) != 0) { + throw "bad stringer_mode:" + iter->second; + } + stringer_mode_ = iter->second; } else { throw "unknown option go:" + iter->first; } @@ -298,6 +308,7 @@ class t_go_generator : public t_generator { bool read_write_private_; bool ignore_initialisms_; bool skip_remote_; + std::string stringer_mode_; /** * File streams