<!--{
  "Path": "/",
  "Template": true
}-->

<div class="HomeContainer">
  <section class="HomeSection Hero">
    <h1 class="Hero-header">
      Go is an open source programming language that makes it easy to build
      <strong>simple</strong>, <strong>reliable</strong>, and <strong>efficient</strong> software.
    </h1>
    <i class="Hero-gopher"></i>
    <a href="/dl/" class="Button Button--big HeroDownloadButton">
      <img class="HeroDownloadButton-image" src="/lib/godoc/images/cloud-download.svg" alt="">
      Download Go
    </a>
    <p class="Hero-description">
      Binary distributions available for<br>
      Linux, macOS, Windows, and more.
    </p>
  </section>

  <section class="HomeSection Playground">
    <div class="Playground-headerContainer">
      <h2 class="HomeSection-header">Try Go</h2>
      {{if not $.GoogleCN}}
        <a class="Playground-popout js-playgroundShareEl">Open in Playground</a>
      {{end}}
    </div>
    <div class="Playground-inputContainer">
      <textarea class="Playground-input js-playgroundCodeEl" spellcheck="false" aria-label="Try Go">// You can edit this code!
// Click here and start typing.
package main

import "fmt"

func main() {
	fmt.Println("Hello, 世界")
}
</textarea>
    </div>
    <div class="Playground-outputContainer js-playgroundOutputEl">
      <pre class="Playground-output"><noscript>Hello, 世界</noscript></pre>
    </div>
    <div class="Playground-controls">
      <select class="Playground-selectExample js-playgroundToysEl" aria-label="Code examples">
        <option value="hello.go">Hello, World!</option>
        <option value="life.go">Conway's Game of Life</option>
        <option value="fib.go">Fibonacci Closure</option>
        <option value="peano.go">Peano Integers</option>
        <option value="pi.go">Concurrent pi</option>
        <option value="sieve.go">Concurrent Prime Sieve</option>
        <option value="solitaire.go">Peg Solitaire Solver</option>
        <option value="tree.go">Tree Comparison</option>
      </select>
      <div class="Playground-buttons">
        <button class="Button Button--primary js-playgroundRunEl" title="Run this code [shift-enter]">Run</button>
        <div class="Playground-secondaryButtons">
          {{if not $.GoogleCN}}
            <button class="Button js-playgroundShareEl" title="Share this code">Share</button>
            <a class="Button tour" href="https://tour.golang.org/" title="Playground Go from your browser">Tour</a>
          {{end}}
        </div>
      </div>
    </div>
  </section>

  {{if not $.GoogleCN}}
    <section class="HomeSection Blog js-blogContainerEl">
      <h2 class="HomeSection-header">Featured articles</h2>
      <div class="Blog-footer js-blogFooterEl"><a class="Button Button--primary" href="https://blog.golang.org/">Read more &gt;</a></div>
    </section>

    <section class="HomeSection">
      <h2 class="HomeSection-header">Featured video</h2>
      <div class="js-videoContainer" style="--aspect-ratio-padding: 58.07%;">
        <iframe width="415" height="241" src="https://www.youtube.com/embed/cQ7STILAS0M" frameborder="0" allowfullscreen></iframe>
      </div>
    </section>
  {{end}}
</div>
<script>
(function() {
  'use strict';

  window.initFuncs.push(function() {
    // Set up playground if enabled.
    if (window.playground) {
      window.playground({
        "codeEl":        ".js-playgroundCodeEl",
        "outputEl":      ".js-playgroundOutputEl",
        "runEl":         ".js-playgroundRunEl",
        "shareEl":       ".js-playgroundShareEl",
        "shareRedirect": "//play.golang.org/p/",
        "toysEl":        ".js-playgroundToysEl"
      });

      // The pre matched below is added by the code above. Style it appropriately.
      document.querySelector(".js-playgroundOutputEl pre").classList.add("Playground-output");
    } else {
      $(".Playground").hide();
    }
  });

  {{if not $.GoogleCN}}
    function readableTime(t) {
      var m = ["January", "February", "March", "April", "May", "June", "July",
        "August", "September", "October", "November", "December"];
      var p = t.substring(0, t.indexOf("T")).split("-");
      var d = new Date(p[0], p[1]-1, p[2]);
      return d.getDate() + " " + m[d.getMonth()] + " " + d.getFullYear();
    }

    window.feedLoaded = function(result) {
      var read = document.querySelector(".js-blogFooterEl");
      for (var i = 0; i < result.length && i < 2; i++) {
        var entry = result[i];
        var header = document.createElement("h3");
        header.className = "Blog-title";
        var titleLink = document.createElement("a");
        titleLink.href = entry.Link;
        titleLink.rel = "noopener";
        titleLink.textContent = entry.Title;
        header.appendChild(titleLink);
        read.parentNode.insertBefore(header, read);
        var extract = document.createElement("div");
        extract.className = "Blog-extract";
        extract.innerHTML = entry.Summary;
        // Ensure any cross-origin links have rel=noopener set.
        var links = extract.querySelectorAll("a");
        for (var j = 0; j < links.length; j++) {
          links[j].rel = "noopener";
          links[j].classList.add("Blog-link");
        }
        read.parentNode.insertBefore(extract, read);
        var when = document.createElement("div");
        when.className = "Blog-when";
        when.textContent = "Published " + readableTime(entry.Time);
        read.parentNode.insertBefore(when, read);
      }
    }

    window.initFuncs.push(function() {
      // Load blog feed.
      $("<script/>")
        .attr("src", "//blog.golang.org/.json?jsonp=feedLoaded")
        .appendTo("body");

      // Set the video at random.
      var videos = [
        {
          s: "https://www.youtube.com/embed/rFejpH_tAHM",
          title: "dotGo 2015 - Rob Pike - Simplicity is Complicated",
        },
        {
          s: "https://www.youtube.com/embed/0ReKdcpNyQg",
          title: "GopherCon 2015: Robert Griesemer - The Evolution of Go",
        },
        {
          s: "https://www.youtube.com/embed/sX8r6zATHGU",
          title: "Steve Francia - Go: building on the shoulders of giants and stepping on a few toes",
        },
        {
          s: "https://www.youtube.com/embed/rWJHbh6qO_Y",
          title: "Brad Fitzpatrick Go 1.11 and beyond",
        },
        {
          s: "https://www.youtube.com/embed/bmZNaUcwBt4",
          title: "The Why of Go",
        },
        {
          s: "https://www.youtube.com/embed/0Zbh_vmAKvk",
          title: "GopherCon 2017: Russ Cox - The Future of Go",
        },
      ];
      var v = videos[Math.floor(Math.random()*videos.length)];
      $(".js-videoContainer iframe").attr("src", v.s).attr("title", v.title);
    });
  {{end}} {{/* if not .GoogleCN */}}
})();
</script>
