blob: 1065a7b4e933ea299061e219abf599cbd779bd18 [file] [log] [blame]
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<meta content="en-us" http-equiv="Content-Language" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="/static/images/favicon.ico" rel="shortcut icon" />
<link href="/static/css/style.css" rel="stylesheet" type="text/css" />
<link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
<link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
<link href="/static/css/thrift.css" media="screen, projection" rel="stylesheet" type="text/css" />
<script src="/static/js/jquery.min.js"></script>
<script src="/static/js/bootstrap-dropdown.js"></script>
<script src="/static/js/bootstrap-tab.js"></script>
<script src="/static/js/thrift.js"></script>
<title>Apache Thrift - Go</title>
</head>
<body>
<div class="navbar">
<div class="navbar-inner">
<div class="container">
<a class="brand" href="/">Apache Thrift &trade;</a>
<div class="nav-collapse">
<ul class="nav pull-right">
<li><a href="/download">Download</a></li>
<li><a href="/docs">Documentation</a></li>
<li><a href="/developers">Developers</a></li>
<li><a href="/lib">Libraries</a></li>
<li><a href="/tutorial">Tutorial</a></li>
<li><a href="/test">Test Suite</a></li>
<li><a href="/about">About</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Apache <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="http://www.apache.org/" target="_blank">Apache Home</a></li>
<li><a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a></li>
<li><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a></li>
<li><a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a></li>
<li><a href="http://www.apache.org/security/" target="_blank">Security</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="container">
<h2>Go Tutorial</h2>
<h3>Introduction</h3>
<p>
All Apache Thrift tutorials require that you have:
<ol>
<li>The Apache Thrift Compiler and Libraries, see <a href="/download">Download</a> and <a href="/docs/BuildingFromSource">Building from Source</a> for more details.</li>
<li>Generated the <a href="https://github.com/apache/thrift/blob/master/tutorial/tutorial.thrift">tutorial.thrift</a> and <a href="https://github.com/apache/thrift/blob/master/tutorial/shared.thrift">shared.thrift</a> files:<br>
<pre><code>thrift -r --gen go tutorial.thrift</code></pre>
</li>
<li>Followed all prerequisites listed below.</li>
</ol>
<h3 id="prerequisites">Prerequisites</h3>
<ul>
<li>At least Go 1.7 is required to run the tutorial code.</li>
<li>The GOPATH may need to be adjusted, alternatively manually put the Go Thrift library files into a suitable location.</li>
<li>The Thrift library and compiler must be the same version. Applications might work even with a version mismatch, but this unsupported.
To use a specific version of the library, either clone the repository for that version, or use a package manager like <a href="https://golang.github.io/dep/">dep</a> or <a href="https://github.com/golang/go/wiki/Modules">Go modules</a>.</li>
</ul>
<h3 id="client">Client</h3>
<div class="highlight"><pre class="codehilite"><code><span class="n">import</span> <span class="p">(</span>
<span class="s">"context"</span>
<span class="s">"fmt"</span>
<span class="s">"github.com/apache/thrift/lib/go/thrift"</span>
<span class="s">"github.com/apache/thrift/tutorial/go/gen-go/tutorial"</span>
<span class="p">)</span>
<span class="n">var</span> <span class="n">defaultCtx</span> <span class="o">=</span> <span class="n">context</span><span class="p">.</span><span class="n">Background</span><span class="p">()</span>
<span class="n">func</span> <span class="nf">handleClient</span><span class="p">(</span><span class="n">client</span> <span class="o">*</span><span class="n">tutorial</span><span class="p">.</span><span class="n">CalculatorClient</span><span class="p">)</span> <span class="p">(</span><span class="n">err</span> <span class="n">error</span><span class="p">)</span> <span class="p">{</span>
<span class="n">client</span><span class="p">.</span><span class="n">Ping</span><span class="p">(</span><span class="n">defaultCtx</span><span class="p">)</span>
<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"ping()"</span><span class="p">)</span>
<span class="n">sum</span><span class="p">,</span> <span class="n">_</span> <span class="o">:=</span> <span class="n">client</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">defaultCtx</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">fmt</span><span class="p">.</span><span class="n">Print</span><span class="p">(</span><span class="s">"1+1="</span><span class="p">,</span> <span class="n">sum</span><span class="p">,</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
<span class="n">work</span> <span class="o">:=</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">NewWork</span><span class="p">()</span>
<span class="n">work</span><span class="p">.</span><span class="n">Op</span> <span class="o">=</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">Operation_DIVIDE</span>
<span class="n">work</span><span class="p">.</span><span class="n">Num1</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">work</span><span class="p">.</span><span class="n">Num2</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">quotient</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">client</span><span class="p">.</span><span class="n">Calculate</span><span class="p">(</span><span class="n">defaultCtx</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">work</span><span class="p">)</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="n">nil</span> <span class="p">{</span>
<span class="k">switch</span> <span class="n">v</span> <span class="o">:=</span> <span class="n">err</span><span class="p">.(</span><span class="n">type</span><span class="p">)</span> <span class="p">{</span>
<span class="k">case</span> <span class="o">*</span><span class="n">tutorial</span><span class="p">.</span><span class="n">InvalidOperation</span><span class="p">:</span>
<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Invalid operation:"</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="nl">default:</span>
<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Error during operation:"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="p">}</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Whoa we can divide by 0 with new value:"</span><span class="p">,</span> <span class="n">quotient</span><span class="p">)</span>
<span class="p">}</span>
<span class="n">work</span><span class="p">.</span><span class="n">Op</span> <span class="o">=</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">Operation_SUBTRACT</span>
<span class="n">work</span><span class="p">.</span><span class="n">Num1</span> <span class="o">=</span> <span class="mi">15</span>
<span class="n">work</span><span class="p">.</span><span class="n">Num2</span> <span class="o">=</span> <span class="mi">10</span>
<span class="n">diff</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">client</span><span class="p">.</span><span class="n">Calculate</span><span class="p">(</span><span class="n">defaultCtx</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="n">work</span><span class="p">)</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="n">nil</span> <span class="p">{</span>
<span class="k">switch</span> <span class="n">v</span> <span class="o">:=</span> <span class="n">err</span><span class="p">.(</span><span class="n">type</span><span class="p">)</span> <span class="p">{</span>
<span class="k">case</span> <span class="o">*</span><span class="n">tutorial</span><span class="p">.</span><span class="n">InvalidOperation</span><span class="p">:</span>
<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Invalid operation:"</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="nl">default:</span>
<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Error during operation:"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="p">}</span>
<span class="k">return</span> <span class="n">err</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">fmt</span><span class="p">.</span><span class="n">Print</span><span class="p">(</span><span class="s">"15-10="</span><span class="p">,</span> <span class="n">diff</span><span class="p">,</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
<span class="p">}</span>
<span class="n">log</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">client</span><span class="p">.</span><span class="n">GetStruct</span><span class="p">(</span><span class="n">defaultCtx</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="n">nil</span> <span class="p">{</span>
<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Unable to get struct:"</span><span class="p">,</span> <span class="n">err</span><span class="p">)</span>
<span class="k">return</span> <span class="n">err</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Check log:"</span><span class="p">,</span> <span class="n">log</span><span class="p">.</span><span class="n">Value</span><span class="p">)</span>
<span class="p">}</span>
<span class="k">return</span> <span class="n">err</span>
<span class="p">}</span>
<span class="n">func</span> <span class="nf">runClient</span><span class="p">(</span><span class="n">transportFactory</span> <span class="n">thrift</span><span class="p">.</span><span class="n">TTransportFactory</span><span class="p">,</span> <span class="n">protocolFactory</span> <span class="n">thrift</span><span class="p">.</span><span class="n">TProtocolFactory</span><span class="p">,</span> <span class="n">addr</span> <span class="n">string</span><span class="p">,</span> <span class="n">secure</span> <span class="kt">bool</span><span class="p">,</span> <span class="n">cfg</span> <span class="o">*</span><span class="n">thrift</span><span class="p">.</span><span class="n">TConfiguration</span><span class="p">)</span> <span class="n">error</span> <span class="p">{</span>
<span class="n">var</span> <span class="n">transport</span> <span class="n">thrift</span><span class="p">.</span><span class="n">TTransport</span>
<span class="k">if</span> <span class="n">secure</span> <span class="p">{</span>
<span class="n">transport</span> <span class="o">=</span> <span class="n">thrift</span><span class="p">.</span><span class="n">NewTSSLSocketConf</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="n">cfg</span><span class="p">)</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">transport</span> <span class="o">=</span> <span class="n">thrift</span><span class="p">.</span><span class="n">NewTSocketConf</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="n">cfg</span><span class="p">)</span>
<span class="p">}</span>
<span class="n">transport</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">transportFactory</span><span class="p">.</span><span class="n">GetTransport</span><span class="p">(</span><span class="n">transport</span><span class="p">)</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="n">nil</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">err</span>
<span class="p">}</span>
<span class="n">defer</span> <span class="n">transport</span><span class="p">.</span><span class="n">Close</span><span class="p">()</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">transport</span><span class="p">.</span><span class="n">Open</span><span class="p">();</span> <span class="n">err</span> <span class="o">!=</span> <span class="n">nil</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">err</span>
<span class="p">}</span>
<span class="n">iprot</span> <span class="o">:=</span> <span class="n">protocolFactory</span><span class="p">.</span><span class="n">GetProtocol</span><span class="p">(</span><span class="n">transport</span><span class="p">)</span>
<span class="n">oprot</span> <span class="o">:=</span> <span class="n">protocolFactory</span><span class="p">.</span><span class="n">GetProtocol</span><span class="p">(</span><span class="n">transport</span><span class="p">)</span>
<span class="k">return</span> <span class="n">handleClient</span><span class="p">(</span><span class="n">tutorial</span><span class="p">.</span><span class="n">NewCalculatorClient</span><span class="p">(</span><span class="n">thrift</span><span class="p">.</span><span class="n">NewTStandardClient</span><span class="p">(</span><span class="n">iprot</span><span class="p">,</span> <span class="n">oprot</span><span class="p">)))</span>
<span class="err">}</span>
</code></pre></div>
<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/go/src/client.go">tutorial/go/src/client.go</a>
</p>
<h3 id="server">Server</h3>
<div class="highlight"><pre class="codehilite"><code><span class="n">import</span> <span class="p">(</span>
<span class="s">"crypto/tls"</span>
<span class="s">"fmt"</span>
<span class="s">"github.com/apache/thrift/lib/go/thrift"</span>
<span class="s">"github.com/apache/thrift/tutorial/go/gen-go/tutorial"</span>
<span class="p">)</span>
<span class="n">func</span> <span class="nf">runServer</span><span class="p">(</span><span class="n">transportFactory</span> <span class="n">thrift</span><span class="p">.</span><span class="n">TTransportFactory</span><span class="p">,</span> <span class="n">protocolFactory</span> <span class="n">thrift</span><span class="p">.</span><span class="n">TProtocolFactory</span><span class="p">,</span> <span class="n">addr</span> <span class="n">string</span><span class="p">,</span> <span class="n">secure</span> <span class="kt">bool</span><span class="p">)</span> <span class="n">error</span> <span class="p">{</span>
<span class="n">var</span> <span class="n">transport</span> <span class="n">thrift</span><span class="p">.</span><span class="n">TServerTransport</span>
<span class="n">var</span> <span class="n">err</span> <span class="n">error</span>
<span class="k">if</span> <span class="n">secure</span> <span class="p">{</span>
<span class="n">cfg</span> <span class="o">:=</span> <span class="k">new</span><span class="p">(</span><span class="n">tls</span><span class="p">.</span><span class="n">Config</span><span class="p">)</span>
<span class="k">if</span> <span class="n">cert</span><span class="p">,</span> <span class="n">err</span> <span class="o">:=</span> <span class="n">tls</span><span class="p">.</span><span class="n">LoadX509KeyPair</span><span class="p">(</span><span class="s">"server.crt"</span><span class="p">,</span> <span class="s">"server.key"</span><span class="p">);</span> <span class="n">err</span> <span class="o">==</span> <span class="n">nil</span> <span class="p">{</span>
<span class="n">cfg</span><span class="p">.</span><span class="n">Certificates</span> <span class="o">=</span> <span class="n">append</span><span class="p">(</span><span class="n">cfg</span><span class="p">.</span><span class="n">Certificates</span><span class="p">,</span> <span class="n">cert</span><span class="p">)</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">err</span>
<span class="p">}</span>
<span class="n">transport</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">thrift</span><span class="p">.</span><span class="n">NewTSSLServerSocket</span><span class="p">(</span><span class="n">addr</span><span class="p">,</span> <span class="n">cfg</span><span class="p">)</span>
<span class="err">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="n">transport</span><span class="p">,</span> <span class="n">err</span> <span class="o">=</span> <span class="n">thrift</span><span class="p">.</span><span class="n">NewTServerSocket</span><span class="p">(</span><span class="n">addr</span><span class="p">)</span>
<span class="p">}</span>
<span class="k">if</span> <span class="n">err</span> <span class="o">!=</span> <span class="n">nil</span> <span class="p">{</span>
<span class="k">return</span> <span class="n">err</span>
<span class="p">}</span>
<span class="n">fmt</span><span class="p">.</span><span class="n">Printf</span><span class="p">(</span><span class="s">"%T</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">transport</span><span class="p">)</span>
<span class="n">handler</span> <span class="o">:=</span> <span class="n">NewCalculatorHandler</span><span class="p">()</span>
<span class="n">processor</span> <span class="o">:=</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">NewCalculatorProcessor</span><span class="p">(</span><span class="n">handler</span><span class="p">)</span>
<span class="n">server</span> <span class="o">:=</span> <span class="n">thrift</span><span class="p">.</span><span class="n">NewTSimpleServer4</span><span class="p">(</span><span class="n">processor</span><span class="p">,</span> <span class="n">transport</span><span class="p">,</span> <span class="n">transportFactory</span><span class="p">,</span> <span class="n">protocolFactory</span><span class="p">)</span>
<span class="n">fmt</span><span class="p">.</span><span class="n">Println</span><span class="p">(</span><span class="s">"Starting the simple server... on "</span><span class="p">,</span> <span class="n">addr</span><span class="p">)</span>
<span class="k">return</span> <span class="n">server</span><span class="p">.</span><span class="n">Serve</span><span class="p">()</span>
</code></pre></div>
<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/go/src/server.go">tutorial/go/src/server.go</a>
</p>
<h3 id="server-handler">Server Handler</h3>
<div class="highlight"><pre class="codehilite"><code><span class="n">import</span> <span class="p">(</span>
<span class="s">"context"</span>
<span class="s">"fmt"</span>
<span class="s">"strconv"</span>
<span class="s">"github.com/apache/thrift/tutorial/go/gen-go/shared"</span>
<span class="s">"github.com/apache/thrift/tutorial/go/gen-go/tutorial"</span>
<span class="p">)</span>
<span class="n">type</span> <span class="n">CalculatorHandler</span> <span class="k">struct</span> <span class="p">{</span>
<span class="n">log</span> <span class="n">map</span><span class="p">[</span><span class="kt">int</span><span class="p">]</span><span class="o">*</span><span class="n">shared</span><span class="p">.</span><span class="n">SharedStruct</span>
<span class="p">}</span>
<span class="n">func</span> <span class="nf">NewCalculatorHandler</span><span class="p">()</span> <span class="o">*</span><span class="n">CalculatorHandler</span> <span class="p">{</span>
<span class="k">return</span> <span class="o">&amp;</span><span class="n">CalculatorHandler</span><span class="p">{</span><span class="n">log</span><span class="o">:</span> <span class="n">make</span><span class="p">(</span><span class="n">map</span><span class="p">[</span><span class="kt">int</span><span class="p">]</span><span class="o">*</span><span class="n">shared</span><span class="p">.</span><span class="n">SharedStruct</span><span class="p">)}</span>
<span class="p">}</span>
<span class="n">func</span> <span class="p">(</span><span class="n">p</span> <span class="o">*</span><span class="n">CalculatorHandler</span><span class="p">)</span> <span class="n">Ping</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="p">.</span><span class="n">Context</span><span class="p">)</span> <span class="p">(</span><span class="n">err</span> <span class="n">error</span><span class="p">)</span> <span class="p">{</span>
<span class="n">fmt</span><span class="p">.</span><span class="n">Print</span><span class="p">(</span><span class="s">"ping()</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
<span class="k">return</span> <span class="n">nil</span>
<span class="p">}</span>
<span class="n">func</span> <span class="p">(</span><span class="n">p</span> <span class="o">*</span><span class="n">CalculatorHandler</span><span class="p">)</span> <span class="n">Add</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="p">.</span><span class="n">Context</span><span class="p">,</span> <span class="n">num1</span> <span class="n">int32</span><span class="p">,</span> <span class="n">num2</span> <span class="n">int32</span><span class="p">)</span> <span class="p">(</span><span class="n">retval17</span> <span class="n">int32</span><span class="p">,</span> <span class="n">err</span> <span class="n">error</span><span class="p">)</span> <span class="p">{</span>
<span class="n">fmt</span><span class="p">.</span><span class="n">Print</span><span class="p">(</span><span class="s">"add("</span><span class="p">,</span> <span class="n">num1</span><span class="p">,</span> <span class="s">","</span><span class="p">,</span> <span class="n">num2</span><span class="p">,</span> <span class="s">")</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
<span class="k">return</span> <span class="n">num1</span> <span class="o">+</span> <span class="n">num2</span><span class="p">,</span> <span class="n">nil</span>
<span class="p">}</span>
<span class="n">func</span> <span class="p">(</span><span class="n">p</span> <span class="o">*</span><span class="n">CalculatorHandler</span><span class="p">)</span> <span class="n">Calculate</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="p">.</span><span class="n">Context</span><span class="p">,</span> <span class="n">logid</span> <span class="n">int32</span><span class="p">,</span> <span class="n">w</span> <span class="o">*</span><span class="n">tutorial</span><span class="p">.</span><span class="n">Work</span><span class="p">)</span> <span class="p">(</span><span class="n">val</span> <span class="n">int32</span><span class="p">,</span> <span class="n">err</span> <span class="n">error</span><span class="p">)</span> <span class="p">{</span>
<span class="n">fmt</span><span class="p">.</span><span class="n">Print</span><span class="p">(</span><span class="s">"calculate("</span><span class="p">,</span> <span class="n">logid</span><span class="p">,</span> <span class="s">", {"</span><span class="p">,</span> <span class="n">w</span><span class="p">.</span><span class="n">Op</span><span class="p">,</span> <span class="s">","</span><span class="p">,</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span><span class="p">,</span> <span class="s">","</span><span class="p">,</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span><span class="p">,</span> <span class="s">"})</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
<span class="k">switch</span> <span class="n">w</span><span class="p">.</span><span class="n">Op</span> <span class="p">{</span>
<span class="k">case</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">Operation_ADD</span><span class="p">:</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span> <span class="o">+</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span>
<span class="k">case</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">Operation_SUBTRACT</span><span class="p">:</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span> <span class="o">-</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span>
<span class="k">case</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">Operation_MULTIPLY</span><span class="p">:</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span> <span class="o">*</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span>
<span class="k">case</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">Operation_DIVIDE</span><span class="p">:</span>
<span class="k">if</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">{</span>
<span class="n">ouch</span> <span class="o">:=</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">NewInvalidOperation</span><span class="p">()</span>
<span class="n">ouch</span><span class="p">.</span><span class="n">WhatOp</span> <span class="o">=</span> <span class="n">int32</span><span class="p">(</span><span class="n">w</span><span class="p">.</span><span class="n">Op</span><span class="p">)</span>
<span class="n">ouch</span><span class="p">.</span><span class="n">Why</span> <span class="o">=</span> <span class="s">"Cannot divide by 0"</span>
<span class="n">err</span> <span class="o">=</span> <span class="n">ouch</span>
<span class="k">return</span>
<span class="p">}</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">w</span><span class="p">.</span><span class="n">Num1</span> <span class="o">/</span> <span class="n">w</span><span class="p">.</span><span class="n">Num2</span>
<span class="nl">default:</span>
<span class="n">ouch</span> <span class="o">:=</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">NewInvalidOperation</span><span class="p">()</span>
<span class="n">ouch</span><span class="p">.</span><span class="n">WhatOp</span> <span class="o">=</span> <span class="n">int32</span><span class="p">(</span><span class="n">w</span><span class="p">.</span><span class="n">Op</span><span class="p">)</span>
<span class="n">ouch</span><span class="p">.</span><span class="n">Why</span> <span class="o">=</span> <span class="s">"Unknown operation"</span>
<span class="n">err</span> <span class="o">=</span> <span class="n">ouch</span>
<span class="k">return</span>
<span class="p">}</span>
<span class="n">entry</span> <span class="o">:=</span> <span class="n">shared</span><span class="p">.</span><span class="n">NewSharedStruct</span><span class="p">()</span>
<span class="n">entry</span><span class="p">.</span><span class="n">Key</span> <span class="o">=</span> <span class="n">logid</span>
<span class="n">entry</span><span class="p">.</span><span class="n">Value</span> <span class="o">=</span> <span class="n">strconv</span><span class="p">.</span><span class="n">Itoa</span><span class="p">(</span><span class="kt">int</span><span class="p">(</span><span class="n">val</span><span class="p">))</span>
<span class="n">k</span> <span class="o">:=</span> <span class="kt">int</span><span class="p">(</span><span class="n">logid</span><span class="p">)</span>
<span class="cm">/*
oldvalue, exists := p.log[k]
if exists {
fmt.Print("Replacing ", oldvalue, " with ", entry, " for key ", k, "\n")
} else {
fmt.Print("Adding ", entry, " for key ", k, "\n")
}
*/</span>
<span class="n">p</span><span class="p">.</span><span class="n">log</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">=</span> <span class="n">entry</span>
<span class="k">return</span> <span class="n">val</span><span class="p">,</span> <span class="n">err</span>
<span class="p">}</span>
<span class="n">func</span> <span class="p">(</span><span class="n">p</span> <span class="o">*</span><span class="n">CalculatorHandler</span><span class="p">)</span> <span class="n">GetStruct</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="p">.</span><span class="n">Context</span><span class="p">,</span> <span class="n">key</span> <span class="n">int32</span><span class="p">)</span> <span class="p">(</span><span class="o">*</span><span class="n">shared</span><span class="p">.</span><span class="n">SharedStruct</span><span class="p">,</span> <span class="n">error</span><span class="p">)</span> <span class="p">{</span>
<span class="n">fmt</span><span class="p">.</span><span class="n">Print</span><span class="p">(</span><span class="s">"getStruct("</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="s">")</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
<span class="n">v</span> <span class="o">:=</span> <span class="n">p</span><span class="p">.</span><span class="n">log</span><span class="p">[</span><span class="kt">int</span><span class="p">(</span><span class="n">key</span><span class="p">)]</span>
<span class="k">return</span> <span class="n">v</span><span class="p">,</span> <span class="n">nil</span>
<span class="p">}</span>
<span class="n">func</span> <span class="p">(</span><span class="n">p</span> <span class="o">*</span><span class="n">CalculatorHandler</span><span class="p">)</span> <span class="n">Zip</span><span class="p">(</span><span class="n">ctx</span> <span class="n">context</span><span class="p">.</span><span class="n">Context</span><span class="p">)</span> <span class="p">(</span><span class="n">err</span> <span class="n">error</span><span class="p">)</span> <span class="p">{</span>
<span class="n">fmt</span><span class="p">.</span><span class="n">Print</span><span class="p">(</span><span class="s">"zip()</span><span class="se">\n</span><span class="s">"</span><span class="p">)</span>
<span class="k">return</span> <span class="n">nil</span>
<span class="p">}</span>
</code></pre></div>
<p class="snippet_footer">This snippet was generated by Apache Thrift's <strong>source tree docs</strong>:
<a href="https://gitbox.apache.org/repos/asf?p=thrift.git;a=blob;hb=HEAD;f=tutorial/go/src/handler.go">tutorial/go/src/handler.go</a>
</p>
<h2 id="additional-information">Additional Information</h2>
<ul>
<li>Try using one of the other available protocols, default is binary.</li>
<li>Try using the buffered and/or framed transport options.</li>
<li>Note that both server and client must use the exact same protocol and transport stack.</li>
</ul>
</div>
<div class="container">
<hr>
<footer class="footer">
<div class="row">
<div class="span3">
<h3>Links</h3>
<ul class="unstyled">
<li><a href="/download">Download</a></li>
<li><a href="/developers">Developers</a></li>
<li><a href="/tutorial">Tutorials</a></li>
</ul>
<ul class="unstyled">
<li><a href="/sitemap">Sitemap</a></li>
</ul>
</div>
<div class="span3">
<h3>Get Involved</h3>
<ul class="unstyled">
<li><a href="/mailing">Mailing Lists</a></li>
<li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
<li><a href="/docs/HowToContribute">How To Contribute</a></li>
</ul>
</div>
<div class="span6">
<a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a>
Copyright &copy; 2024 <a href="http://www.apache.org/">Apache Software Foundation</a>.
Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>.
Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
</div>
</div>
</footer>
</div>
</body>
</html>