<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(5)
        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 it 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=jgVhBThJdXc"><img src="/doc/play_overlay.png" class="thumbnail _001" /> <span class="caption title">&ldquo;Go Programming&rdquo;</span> <span class="caption description">Google I/O Tech Talk</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" class="resources">
          <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>
