<link rel="stylesheet" type="text/css" href="/doc/frontpage.css">

<script src="http://www.google.com/jsapi" type="text/javascript"></script>
<script type="text/javascript">
function loadFeed() {
        var url = "http://blog.golang.org/feeds/posts/default";
        var divId = "blogFeed";
        var feed = new google.feeds.Feed(url);
        feed.setNumEntries(4)
        feed.load(function (result) {
                var container = document.getElementById(divId)
                if (result.error) {
                        container.innerHTML = "Error loading feed.";
                        return;
                }
                container.innerHTML = "";
                var entries = result.feed.entries;
                for (var i=0; i<entries.length; i++) {
                        var li = document.createElement("li");
                        var a = document.createElement("a");
                        a.setAttribute("href", entries[i].link);
                        var span_title = document.createElement("span"); 
                        span_title.appendChild(document.createTextNode(entries[i].title));
                        span_title.className = "title";
                        a.appendChild(span_title);
                        li.appendChild(a);
                        var span_date = document.createElement("span"); 
                        span_date.appendChild(document.createTextNode(entries[i].publishedDate.substr(0, 11)));
                        span_date.className = "date";
                        a.appendChild(span_date);
                        container.appendChild(li);
                }
        });
}
google.load("feeds", "1");
google.setOnLoadCallback(loadFeed);
</script>

  <div id="frontpage">
    <div class="left-column">
      <p style="margin-top: 0;">
        The Go programming language is an open source project to make
        programmers more productive.  Go is expressive, concise, clean,
        and efficient.  Its concurrency mechanisms make it easy to write
        programs that get the most out of multicore and networked machines,
        while its novel type system enables flexible and modular program
        construction.  Go compiles quickly to machine code yet has the
        convenience of garbage collection and the power of run-time reflection.
        It's a fast, statically typed, compiled language that feels like a 
        dynamically typed, interpreted language.
      </p>
      <h2>Check it out!</h2>
      <p>
      <div class="how">[<a href="/doc/playground.html">How does this work?</a>]</div>
      <a href="/doc/install.html">Install Go now</a>, or try it right here in your browser:</p>
      <div id="playground" class="small"></div>
      <script src="/doc/play/playground.js"></script>
    </div>
    <div class="right-column">
      <div id="content-rotating">
      <div id="content-videos">
        <h2>Go Videos <span class="more">| <a href="/doc/docs.html#videos_talks">More...</a></span></h2>
        <a class="video" href="http://www.youtube.com/watch?v=-i0hat7pdpk"><img src="/doc/play_overlay.png" class="thumbnail _005" /> <span class="caption title">&ldquo;Writing Web Apps in Go&rdquo;</span> <span class="caption description">Google I/O 2011</span></a>
      </div>
      <h2>Go Blog <span class="more">| <a href="http://blog.golang.org/">More...</a></span></h2>
      <div id="content-blog">
        <ul id="blogFeed">
        </ul>
      </div>
      </div>
      <h2>Quick Links</h2>
      <div id="resources">
        <div id="resources-users">
          <h3>For newcomers:</h3>
          <ul>
            <li><a href="/doc/install.html">Getting Started</a></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">Go FAQ</a></li>
            <li><a href="/doc/docs.html">Other Documentation</a></li>
          </ul>
        </div>
        <div id="resources-contributors" >
          <h3>For developers:</h3>
          <ul>
            <li><a href="http://godashboard.appspot.com/package">Package Dashboard</a></li>
            <li><a href="http://code.google.com/p/go/issues">Issue Tracker</a></li>
            <li><a href="http://godashboard.appspot.com/">Build Status</a></li>
            <li><a href="http://code.google.com/p/go/source/browse/">Go Source</a> [<a href="http://code.google.com/p/go/source/list">changes</a>]</li>
            <li><a href="/pkg/">Package Reference</a></li>
            <li><a href="/doc/go_spec.html">Language Specification</a></li>
          </ul>
        </div>
      </div>  
    </div>
    <div class="end-columns"></div>
  </div>
