<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://osdc.blip.tv/file/4432146/"><img src="/doc/play_overlay.png" class="thumbnail _004" /> <span class="caption title">&ldquo;Practical Go Programming&rdquo;</span> <span class="caption description">OSDC 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>
