<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>
        Get started now with
	<a target="_blank" href="http://go-tour.appspot.com/">A Tour of Go</a>
        in your browser.
      </h2>
      <p>
      <div class="how">[<a href="/doc/playground.html">How does this work?</a>]</div>
      Or try Go right here:</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>
            <li><a href="http://code.google.com/appengine/docs/go/">Go for Google App Engine</a> <sup class="new">New!</sup></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>
