1. 22 Aug, 2017 10 commits
    • Guilherme Rezende's avatar
      io: add example for Pipe · 5e5a1ed8
      Guilherme Rezende authored
      Change-Id: I24374accf48d43edf4bf27ea6ba2245ddca558ad
      Reviewed-on: https://go-review.googlesource.com/50910Reviewed-by: default avatarGiovanni Bajo <rasky@develer.com>
      Reviewed-by: default avatarJoe Tsai <thebrokentoaster@gmail.com>
      Run-TryBot: Joe Tsai <thebrokentoaster@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      5e5a1ed8
    • Heschi Kreinick's avatar
      cmd/compile: emit DW_AT_decl_line · 4a1be1e1
      Heschi Kreinick authored
      Some debuggers use the declaration line to avoid showing variables
      before they're declared. Emit them for local variables and function
      parameters.
      
      DW_AT_decl_file would be nice too, but since its value is an index
      into a table built by the linker, that's dramatically harder. In
      practice, with inlining disabled it's safe to assume that all a
      function's variables are declared in the same file, so this should still
      be pretty useful.
      
      Change-Id: I8105818c8940cd71bc5473ec98797cce2f3f9872
      Reviewed-on: https://go-review.googlesource.com/44350Reviewed-by: default avatarDavid Chase <drchase@google.com>
      4a1be1e1
    • Martin Möhrmann's avatar
      cmd/compile: replace eqstring with memequal · 3216e0ce
      Martin Möhrmann authored
      eqstring is only called for strings with equal lengths.
      Instead of pushing a pointer and length for each argument string
      on the stack we can omit pushing one of the lengths on the stack.
      
      Changing eqstrings signature to eqstring(*uint8, *uint8, int) bool
      to implement the above optimization would make it very similar to the
      existing memequal(*any, *any, uintptr) bool function.
      
      Since string lengths are positive we can avoid code redundancy and
      use memequal instead of using eqstring with an optimized signature.
      
      go command binary size reduced by 4128 bytes on amd64.
      
      name                          old time/op    new time/op    delta
      CompareStringEqual              6.03ns ± 1%    5.71ns ± 1%   -5.23%  (p=0.000 n=19+18)
      CompareStringIdentical          2.88ns ± 1%    3.22ns ± 7%  +11.86%  (p=0.000 n=20+20)
      CompareStringSameLength         4.31ns ± 1%    4.01ns ± 1%   -7.17%  (p=0.000 n=19+19)
      CompareStringDifferentLength    0.29ns ± 2%    0.29ns ± 2%     ~     (p=1.000 n=20+20)
      CompareStringBigUnaligned       64.3µs ± 2%    64.1µs ± 3%     ~     (p=0.164 n=20+19)
      CompareStringBig                61.9µs ± 1%    61.6µs ± 2%   -0.46%  (p=0.033 n=20+19)
      
      Change-Id: Ice15f3b937c981f0d3bc8479a9ea0d10658ac8df
      Reviewed-on: https://go-review.googlesource.com/53650
      Run-TryBot: Martin Möhrmann <moehrmann@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarKeith Randall <khr@golang.org>
      3216e0ce
    • Kashav Madan's avatar
      cmd/compile: avoid duplicate cast error · d05a1238
      Kashav Madan authored
      If an error was already printed during LHS conversion step, we don't reprint
      the "cannot convert" error.
      
      In particular, this prevents `_ = int("1")` (and all similar casts) from
      resulting in multiple identical error messages being printed.
      
      Fixes #20812.
      
      Change-Id: If6e52c59eab438599d641ecf6f110ebafca740a9
      Reviewed-on: https://go-review.googlesource.com/46912Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
      d05a1238
    • Martin Möhrmann's avatar
      strconv: check bitsize range in ParseInt and ParseUint · 63c42843
      Martin Möhrmann authored
      Return an error when a bitSize below 0 or above 64 is specified.
      
      Move bitSize 0 handling in ParseInt after the call to ParseUint
      to avoid a spill.
      
      AMD64:
      name       old time/op  new time/op  delta
      Atoi       28.9ns ± 6%  27.4ns ± 6%  -5.21%  (p=0.002 n=20+20)
      AtoiNeg    24.6ns ± 2%  23.1ns ± 1%  -6.04%  (p=0.000 n=19+18)
      Atoi64     38.8ns ± 1%  38.0ns ± 1%  -2.03%  (p=0.000 n=17+20)
      Atoi64Neg  35.5ns ± 1%  34.3ns ± 1%  -3.42%  (p=0.000 n=19+20)
      
      Updates #21275
      
      Change-Id: I70f0e4a16fa003f7ea929ca4ef56bd1a4181660b
      Reviewed-on: https://go-review.googlesource.com/55139Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
      Run-TryBot: Robert Griesemer <gri@golang.org>
      63c42843
    • Lakshay Garg's avatar
      math: implement the erfcinv function · 4c0bba15
      Lakshay Garg authored
      Fixes: #6359
      
      Change-Id: I6c697befd681a253e73a7091faa9f20ff3791201
      Reviewed-on: https://go-review.googlesource.com/57090Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
      4c0bba15
    • fanzha02's avatar
      cmd/internal/obj/arm64: fix assemble movk bug · bdd7c01b
      fanzha02 authored
      The current code gets shift arguments value from prog.From3.Offset.
      But prog.From3.Offset is not assigned the shift arguments value in
      instructions assemble process.
      
      The fix calls movcon() function to get the correct value.
      
      Uncomment the movk/movkw  cases.
      
      Fixes #21398
      Change-Id: I78d40c33c24bd4e3688a04622e4af7ddb5333fa6
      Reviewed-on: https://go-review.googlesource.com/54990
      Run-TryBot: Cherry Zhang <cherryyz@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
      bdd7c01b
    • Thomas Wanielista's avatar
      go/doc: classify function returning slice of T as constructor · 33484a6a
      Thomas Wanielista authored
      Previously, go/doc would only consider functions that return types of
      T or any number of pointers to T: *T, **T, etc. This change expands
      the definition of a constructor to also include functions that return
      slices of a type (or pointer to that type) in its first return.
      
      With this change, the following return types classify a function
      as a constructor of type T:
      
      T
      *T
      **T (and so on)
      []T
      []*T
      []**T (and so on)
      
      Fixes #18063.
      
      Change-Id: I9a1a689933e13c6b8eb80b74ceec85bd4cab236d
      Reviewed-on: https://go-review.googlesource.com/54971Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
      33484a6a
    • Brian Kessler's avatar
      math/big: use internal sqr on nats · edaa0ffa
      Brian Kessler authored
      Replace z.mul(x, x) calls on nats in internal code with z.sqr(x)
      that employs optimized squaring routines. Benchmark results:
      
      Exp-4                             12.9ms ± 2%  12.8ms ± 3%     ~     (p=0.165 n=10+10)
      Exp2-4                            13.0ms ± 4%  12.8ms ± 2%   -2.14%  (p=0.015 n=8+9)
      ModSqrt225_Tonelli-4               987µs ± 4%   989µs ± 2%     ~     (p=0.673 n=8+9)
      ModSqrt224_3Mod4-4                 300µs ± 2%   301µs ± 3%     ~     (p=0.546 n=9+9)
      ModSqrt5430_Tonelli-4              4.88s ± 6%   4.82s ± 5%     ~     (p=0.247 n=10+10)
      ModSqrt5430_3Mod4-4                1.62s ±10%   1.57s ± 1%     ~     (p=0.094 n=9+9)
      Exp3Power/0x10-4                   496ns ± 7%   426ns ± 7%  -14.21%  (p=0.000 n=10+10)
      Exp3Power/0x40-4                   575ns ± 5%   470ns ± 7%  -18.20%  (p=0.000 n=9+10)
      Exp3Power/0x100-4                  929ns ±19%   770ns ±10%  -17.13%  (p=0.000 n=10+10)
      Exp3Power/0x400-4                 1.96µs ± 7%  1.79µs ± 5%   -8.68%  (p=0.000 n=10+10)
      Exp3Power/0x1000-4                10.9µs ± 9%   7.9µs ± 5%  -28.02%  (p=0.000 n=10+10)
      Exp3Power/0x4000-4                86.8µs ± 8%  67.3µs ± 8%  -22.41%  (p=0.000 n=10+10)
      Exp3Power/0x10000-4                750µs ± 8%   731µs ± 1%     ~     (p=0.074 n=9+8)
      Exp3Power/0x40000-4               7.07ms ± 7%  7.05ms ± 4%     ~     (p=0.931 n=9+9)
      Exp3Power/0x100000-4              64.7ms ± 2%  65.6ms ± 6%     ~     (p=0.661 n=9+10)
      Exp3Power/0x400000-4               577ms ± 2%   580ms ± 3%     ~     (p=0.931 n=9+9)
      ProbablyPrime/n=0-4               9.08ms ±17%  9.09ms ±16%     ~     (p=0.447 n=9+10)
      ProbablyPrime/n=1-4               10.8ms ± 4%  10.7ms ± 2%     ~     (p=0.243 n=10+9)
      ProbablyPrime/n=5-4               18.5ms ± 3%  18.5ms ± 1%     ~     (p=0.863 n=9+9)
      ProbablyPrime/n=10-4              28.6ms ± 6%  28.2ms ± 1%     ~     (p=0.050 n=9+9)
      ProbablyPrime/n=20-4              48.4ms ± 4%  48.4ms ± 2%     ~     (p=0.739 n=10+10)
      ProbablyPrime/Lucas-4             6.75ms ± 4%  6.75ms ± 2%     ~     (p=0.963 n=9+8)
      ProbablyPrime/MillerRabinBase2-4  2.00ms ± 5%  2.00ms ± 7%     ~     (p=0.931 n=9+9)
      
      Change-Id: Ibe9f58d11dbad25eb369faedf480b666a0250a6b
      Reviewed-on: https://go-review.googlesource.com/56773Reviewed-by: default avatarRobert Griesemer <gri@golang.org>
      edaa0ffa
    • Martin Möhrmann's avatar
      cmd/compile: pass stack allocated bucket to makemap inside hmap · 06a78b57
      Martin Möhrmann authored
      name         old time/op    new time/op    delta
      NewEmptyMap    53.2ns ± 7%    48.0ns ± 5%  -9.77%  (p=0.000 n=20+20)
      NewSmallMap     111ns ± 1%     106ns ± 2%  -3.78%  (p=0.000 n=20+19)
      
      Change-Id: I979d21ab16eae9f6893873becca517db57e054b5
      Reviewed-on: https://go-review.googlesource.com/56290
      Run-TryBot: Martin Möhrmann <moehrmann@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarJosh Bleecher Snyder <josharian@gmail.com>
      06a78b57
  2. 21 Aug, 2017 15 commits
  3. 20 Aug, 2017 1 commit
  4. 19 Aug, 2017 7 commits
    • Elias Naur's avatar
      Revert "misc/cgo/testcshared: temporarily skip testing on android" · ff90f4af
      Elias Naur authored
      This reverts commit a6ffab6b.
      
      Reason for revert: with CL 57290 the tests run on Android again.
      
      Change-Id: Ifeb29762a4cd0178463acfeeb3696884d99d2993
      Reviewed-on: https://go-review.googlesource.com/57310Reviewed-by: default avatarAlex Brainman <alex.brainman@gmail.com>
      ff90f4af
    • Elias Naur's avatar
      misc/cgo/testcshared: fix tests on android · a9e0204c
      Elias Naur authored
      The testcshared test.bash was rewritten in Go, but the rewritten script
      broke on Android. Make the tests run on Android again by:
      
      - Restoring the LD_LIBRARY_PATH path (.).
      - Restoring the Android specific C flags (-pie -fuse-ld=gold).
      - Adding runExe to run test executables. All other commands must run on
      the host.
      
      Fixes #21513.
      
      Change-Id: I3ea617a943c686b15437cc5c118e9802a913d93a
      Reviewed-on: https://go-review.googlesource.com/57290
      Run-TryBot: Elias Naur <elias.naur@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarAlex Brainman <alex.brainman@gmail.com>
      a9e0204c
    • Alex Brainman's avatar
      misc/cgo/testcshared: temporarily skip testing on android · a6ffab6b
      Alex Brainman authored
      For #21513
      
      Change-Id: Ibe9479f8afc6f425779a737a807ff2f839a4f311
      Reviewed-on: https://go-review.googlesource.com/57250
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarAlex Brainman <alex.brainman@gmail.com>
      a6ffab6b
    • Josh Bleecher Snyder's avatar
      .github: update ISSUE_TEMPLATE to be closer to 'go bug' · fc583c54
      Josh Bleecher Snyder authored
      Ask whether the issue reproduces with the latest release.
      
      'go bug' places the version and system details last,
      in part because they're automatically filled.
      I'd like to do the same here, but I worry
      that they'll get ignored.
      
      Change-Id: Iec636a27e6e36d61dca421deaf24ed6fe35d4b11
      Reviewed-on: https://go-review.googlesource.com/50931Reviewed-by: default avatarEmmanuel Odeke <emm.odeke@gmail.com>
      Reviewed-by: default avatarDaniel Martí <mvdan@mvdan.cc>
      Reviewed-by: default avatarAvelino <t@avelino.xxx>
      fc583c54
    • Russ Cox's avatar
      cmd/go: test and fix missing deep dependencies in list Deps output · 6f0b1aa0
      Russ Cox authored
      Fixes #21522.
      
      Change-Id: Ifec1681b265576c47a4d736f6f124cc25485c593
      Reviewed-on: https://go-review.googlesource.com/57011
      Run-TryBot: Russ Cox <rsc@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
      6f0b1aa0
    • Alex Brainman's avatar
      misc/cgo/testcshared: cd into work directory before running android command · e2cdec77
      Alex Brainman authored
      Hopefully this will fix android build.
      
      Maybe fixes #21513
      
      Change-Id: I98f760562646f06b56e385c36927e79458465b92
      Reviewed-on: https://go-review.googlesource.com/56790Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
      Run-TryBot: Ian Lance Taylor <iant@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      e2cdec77
    • Joe Tsai's avatar
      archive/tar: refactor Reader support for sparse files · 3bece2fa
      Joe Tsai authored
      This CL is the first step (of two) for adding sparse file support
      to the Writer. This CL only refactors the logic of sparse-file handling
      in the Reader so that common logic can be easily shared by the Writer.
      
      As a result of this CL, there are some new publicly visible API changes:
      	type SparseEntry struct { Offset, Length int64 }
      	type Header struct { ...; SparseHoles []SparseEntry }
      
      A new type is defined to represent a sparse fragment and a new field
      Header.SparseHoles is added to represent the sparse holes in a file.
      The API intentionally represent sparse files using hole fragments,
      rather than data fragments so that the zero value of SparseHoles
      naturally represents a normal file (i.e., a file without any holes).
      The Reader now populates SparseHoles for sparse files.
      
      It is necessary to export the sparse hole information, otherwise it would
      be impossible for the Writer to specify that it is trying to encode
      a sparse file, and what it looks like.
      
      Some unexported helper functions were added to common.go:
      	func validateSparseEntries(sp []SparseEntry, size int64) bool
      	func alignSparseEntries(src []SparseEntry, size int64) []SparseEntry
      	func invertSparseEntries(src []SparseEntry, size int64) []SparseEntry
      
      The validation logic that used to be in newSparseFileReader is now moved
      to validateSparseEntries so that the Writer can use it in the future.
      alignSparseEntries is currently unused by the Reader, but will be used
      by the Writer in the future. Since TAR represents sparse files by
      only recording the data fragments, we add the invertSparseEntries
      function to convert a list of data fragments to a normalized list
      of hole fragments (and vice-versa).
      
      Some other high-level changes:
      * skipUnread is deleted, where most of it's logic is moved to the
      Discard methods on regFileReader and sparseFileReader.
      * readGNUSparsePAXHeaders was rewritten to be simpler.
      * regFileReader and sparseFileReader were completely rewritten
      in simpler and easier to understand logic.
      * A bug was fixed in sparseFileReader.Read where it failed to
      report an error if the logical size of the file ends before
      consuming all of the underlying data.
      * The tests for sparse-file support was completely rewritten.
      
      Updates #13548
      
      Change-Id: Ic1233ae5daf3b3f4278fe1115d34a90c4aeaf0c2
      Reviewed-on: https://go-review.googlesource.com/56771
      Run-TryBot: Joe Tsai <thebrokentoaster@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
      3bece2fa
  5. 18 Aug, 2017 7 commits
    • Vlad Krasnov's avatar
      crypto/aes: make the GHASH part of AES-GCM faster · b2174a16
      Vlad Krasnov authored
      By processing 8 blocks in parallel GHASH achieves higher throughput on amd64
      
      Results on Skylake i7:
      
      benchmark                   old ns/op     new ns/op     delta
      BenchmarkAESGCMSeal1K-8     316           314           -0.63%
      BenchmarkAESGCMOpen1K-8     282           281           -0.35%
      BenchmarkAESGCMSign8K-8     5611          1099          -80.41%
      BenchmarkAESGCMSeal8K-8     1869          1922          +2.84%
      BenchmarkAESGCMOpen8K-8     1718          1724          +0.35%
      
      benchmark                   old MB/s     new MB/s     speedup
      BenchmarkAESGCMSeal1K-8     3237.10      3260.94      1.01x
      BenchmarkAESGCMOpen1K-8     3629.74      3638.10      1.00x
      BenchmarkAESGCMSign8K-8     1459.82      7452.99      5.11x
      BenchmarkAESGCMSeal8K-8     4382.45      4260.93      0.97x
      BenchmarkAESGCMOpen8K-8     4766.41      4750.54      1.00x
      
      Change-Id: I479f2a791a968caa1c516115b0b6b96a791a20d2
      Reviewed-on: https://go-review.googlesource.com/57150Reviewed-by: default avatarAdam Langley <agl@golang.org>
      b2174a16
    • Austin Clements's avatar
      runtime: fix false positive race in profile label reading · 57584a0e
      Austin Clements authored
      Because profile labels are copied from the goroutine into the tag
      buffer by the signal handler, there's a carefully-crafted set of race
      detector annotations to create the necessary happens-before edges
      between setting a goroutine's profile label and retrieving it from the
      profile tag buffer.
      
      Given the constraints of the signal handler, we have to approximate
      the true synchronization behavior. Currently, that approximation is
      too weak.
      
      Ideally, runtime_setProfLabel would perform a store-release on
      &getg().labels and copying each label into the profile would perform a
      load-acquire on &getg().labels. This would create the necessary
      happens-before edges through each individual g.labels object.
      
      Since we can't do this in the signal handler, we instead synchronize
      on a "labelSync" global. The problem occurs with the following
      sequence:
      
      1. Goroutine 1 calls setProfLabel, which does a store-release on
         labelSync.
      
      2. Goroutine 2 calls setProfLabel, which does a store-release on
         labelSync.
      
      3. Goroutine 3 reads the profile, which does a load-acquire on
         labelSync.
      
      The problem is that the load-acquire only synchronizes with the *most
      recent* store-release to labelSync, and the two store-releases don't
      synchronize with each other. So, once goroutine 3 touches the label
      set by goroutine 1, we report a race.
      
      The solution is to use racereleasemerge. This is like a
      read-modify-write, rather than just a store-release. Each RMW of
      labelSync in runtime_setProfLabel synchronizes with the previous RMW
      of labelSync, and this ultimately carries forward to the load-acquire,
      so it synchronizes with *all* setProfLabel operations, not just the
      most recent.
      
      Change-Id: Iab58329b156122002fff12cfe64fbeacb31c9613
      Reviewed-on: https://go-review.googlesource.com/56670
      Run-TryBot: Austin Clements <austin@google.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarRuss Cox <rsc@golang.org>
      Reviewed-by: default avatarDmitry Vyukov <dvyukov@google.com>
      57584a0e
    • Ilya Tocar's avatar
      cmd/compile/internal/amd64: add ADD[Q|L]constmem · ac29f4d0
      Ilya Tocar authored
      We can add a constant to loaction in memory with 1 instruction,
      as opposed to load+add+store, so add a new op and relevent ssa rules.
      Triggers in e. g. encoding/json isValidNumber:
      NumberIsValid-6          36.4ns ± 0%    35.2ns ± 1%  -3.32%  (p=0.000 n=6+10)
      Shaves ~2.5 kb from go tool.
      
      Change-Id: I7ba576676c2522432360f77b290cecb9574a93c3
      Reviewed-on: https://go-review.googlesource.com/54431
      Run-TryBot: Ilya Tocar <ilya.tocar@intel.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarKeith Randall <khr@golang.org>
      ac29f4d0
    • Daniel Martí's avatar
      cmd/*: remove negative uint checks · 943dd0fe
      Daniel Martí authored
      All of these are uints of different sizes, so checking >= 0 or < 0 are
      effectively no-ops.
      
      Found with staticcheck.
      
      Change-Id: I16ac900eb7007bc8f9018b302136d42e483a4180
      Reviewed-on: https://go-review.googlesource.com/56950Reviewed-by: default avatarMatt Layher <mdlayher@gmail.com>
      Reviewed-by: default avatarIan Lance Taylor <iant@golang.org>
      Run-TryBot: Matt Layher <mdlayher@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      943dd0fe
    • Josh Bleecher Snyder's avatar
      runtime: make evacDst a top level type · 776c33ee
      Josh Bleecher Snyder authored
      This will reduce duplication when evacuate is specialized.
      
      Change-Id: I34cdfb7103442d3e0ea908c970fb46334b86d5c4
      Reviewed-on: https://go-review.googlesource.com/56934
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      Reviewed-by: default avatarDaniel Martí <mvdan@mvdan.cc>
      Reviewed-by: default avatarAvelino <t@avelino.xxx>
      Reviewed-by: default avatarKeith Randall <khr@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      776c33ee
    • Josh Bleecher Snyder's avatar
      runtime: split advanceEvacuationMark from evacuate · e0b34e7b
      Josh Bleecher Snyder authored
      Minor refactoring. This is a step towards specializing evacuate
      for mapfast key types.
      
      Change-Id: Icffe2759b7d38e5c008d03941918d5a912ce62f6
      Reviewed-on: https://go-review.googlesource.com/56933
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      Reviewed-by: default avatarKeith Randall <khr@golang.org>
      e0b34e7b
    • Josh Bleecher Snyder's avatar
      runtime: tiny refactor in evacuate · 43d4c9f4
      Josh Bleecher Snyder authored
      Since oldbucket == h.nevacuate, we can just increment h.nevacuate here.
      This removes oldbucket from scope, which will be useful shortly.
      
      Change-Id: I70f81ec3995f17845ebf5d77ccd20ea4338f23e6
      Reviewed-on: https://go-review.googlesource.com/56932
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      Reviewed-by: default avatarDaniel Martí <mvdan@mvdan.cc>
      Reviewed-by: default avatarAvelino <t@avelino.xxx>
      Reviewed-by: default avatarKeith Randall <khr@golang.org>
      TryBot-Result: Gobot Gobot <gobot@golang.org>
      43d4c9f4