<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/transitional.dtd">
<html>
<head>

  <meta http-equiv="content-type" content="text/html; charset=utf-8">
  <title>{Title|html-esc}</title>

  <link rel="stylesheet" type="text/css" href="/doc/style.css">
  <script type="text/javascript" src="/doc/godocs.js"></script>

</head>

<body>

  <script>
    // Catch 'enter' key down events and trigger the search form submission.
    function codesearchKeyDown(event) {.meta-left}
      if (event.which == 13) {.meta-left}
        var form = document.getElementById('codesearch');
        var query = document.getElementById('codesearchQuery');
        form.q.value = "lang:go package:go.googlecode.com " + query.value;
        document.getElementById('codesearch').submit();
      {.meta-right}
      return true;
    {.meta-right}

    // Capture the submission event and construct the query parameter.
    function codeSearchSubmit() {.meta-left}
      var query = document.getElementById('codesearchQuery');
      var form = document.getElementById('codesearch');
      form.q.value = "lang:go package:go.googlecode.com " + query.value;
      return true;
    {.meta-right}
  </script>

<div id="topnav">
  <table summary="">
    <tr>
      <td id="headerImage">
        <a href="/"><img src="/doc/logo-153x55.png" height="55" width="153" alt="Go Home Page" style="border:0" /></a>
      </td>
      <td>
        <div id="headerDocSetTitle">The Go Programming Language</div>
      </td>
      <td>
        <!-- <table>
          <tr>
            <td>
              <! The input box is outside of the form because we want to add
              a couple of restricts to the query before submitting. If we just
              add the restricts to the text box before submitting, then they
              appear in the box when the user presses 'back'. Thus we use a
              hidden field in the form. However, there's no way to stop the
              non-hidden text box from also submitting a value unless we move
              it outside of the form
              <input type="search" id="codesearchQuery" value="" size="30" onkeydown="return codesearchKeyDown(event);"/>
              <form method="GET" action="http://www.google.com/codesearch" id="codesearch" class="search" onsubmit="return codeSearchSubmit();" style="display:inline;">
                <input type="hidden" name="q" value=""/>
                <input type="submit" value="Code search" />
                <span style="color: red">(TODO: remove for now?)</span>
              </form>
            </td>
          </tr>
          <tr>
            <td>
              <span style="color: gray;">(e.g. &ldquo;pem&rdquo; or &ldquo;xml&rdquo;)</span>
            </td>
          </tr>
        </table> -->
      </td>
    </tr>
  </table>
</div>

<div id="linkList">
  <ul>
    <li class="navhead"><a href="/">Home</a></li>

    <li class="blank">&nbsp;</li>
    <li class="navhead">Documents</li>
    <li><a href="/doc/go_tutorial.html">Tutorial</a></li>
    <li><a href="/doc/effective_go.html">Effective Go</a></li>
    <li><a href="/doc/go_faq.html">FAQ</a></li>
    <li><a href="/doc/go_lang_faq.html">Language Design FAQ</a></li>
    <li><a href="/doc/go_programming_faq.html">Programming FAQ</a></li>
    <li><a href="http://www.youtube.com/watch?v=rKnDgT73v8s">Tech talk (1 hour)</a> (<a href="/doc/talks/go_talk-20091030.pdf">PDF</a>)</li>
    <li><a href="/doc/go_spec.html">Language Specification</a></li>
    <li><a href="/doc/go_mem.html">Memory Model</a></li>
    <li><a href="/doc/go_for_cpp_programmers.html">Go for C++ Programmers</a></li>

    <li class="blank">&nbsp;</li>
    <li class="navhead">Programming</li>
    <li><a href="/doc/install.html">How to install Go</a></li>
    <li><a href="/doc/code.html">How to write code</a></li>
    <li><a href="/cmd">Command documentation</a></li>
    <li><a href="/pkg">Package documentation</a></li>
    {.repeated section PkgRoots}
    <li><a href="/pkg/{@|html-esc}">Package documentation for {@|html-esc}</a></li>
    {.end}
    <li><a href="/src">Source files</a></li>
    <li><a href="/doc/devel/">The Go project</a></li>

    <li class="blank">&nbsp;</li>
    <li class="navhead">Help &amp; Community</li>
    <li><a href="http://blog.golang.org/">Go Blog</a></li>
    <li><a href="http://groups.google.com/group/golang-nuts">Go Nuts mailing list</a></li>
    <li>#go-nuts on irc.freenode.net</li>
    <li><a href="http://code.google.com/p/go/issues/list">Issue tracker</a></li>
    <li><a href="http://code.google.com/p/go/wiki/WikiIndex">Go Wiki</a></li>


    <li class="blank">&nbsp;</li>
    <li class="blank">&nbsp;</li>
    <li class="navhead">Go code search</li>
    <form method="GET" action="/search" class="search">
    <input type="search" name="q" value="{Query|html-esc}" size="25" style="width:80%; max-width:200px" />
    <input type="submit" value="Go" />
    </form>

    <li class="blank">&nbsp;</li>
    <li class="navhead">Last update</li>
	<li>{Timestamp|time}</li>
	<li>Build version {Version|html-esc}</li>
  </ul>
</div>

<div id="content">
  <!-- Menu is HTML-escaped elsewhere -->
  {.section Menu}
    <div id="menu">
      {@}
    </div>
  {.end}

  {.section Title}
    <h1 id="generatedHeader">{@|html-esc}</h1>
  {.end}
  {.section Subtitle}
    <span class="subtitle">{@|html-esc}</span>
  {.end}

  <p>
  <!-- The Table of Contents is automatically inserted in this <div>.
       Do not delete this <div>. -->
  <div id="nav"></div>
  </p>

  <!-- Content is HTML-escaped elsewhere -->
  {Content}
</div>

<div id="footer">
<p>Except as noted, this content is
   licensed under <a href="http://creativecommons.org/licenses/by/3.0/">
   Creative Commons Attribution 3.0</a>.
</div>

</body>
</html>
