SlideShare a Scribd company logo
Highlights of Go 1.1
May 29, 2013

John Graham-Cumming

www.cloudflare.com!
Method Values
•  Function value bound to specific receiver
type Prefixer struct {!
prefix string!
}!
!
func (p Prefixer) Add(s string) string {!
return p.prefix + ": " + s!
}!
!
func main() {!
hawaii := Prefixer{"Aloha”}!
fmt.Printf("%sn", hawaii.Add("Welcome to Honolulu"))!
!
adder := hawaii.Add!
fmt.Printf("%sn", adder("Welcome to Honolulu"))!
}!

www.cloudflare.com!
Change to return handling
•  return statement not needed at end of functions if

function termination is unambiguous

func even() int {!
for {!
if i := rand.Intn(100); i%2 == 0 {!
return i!
}!
}!
}!

•  Worth reading the specification on ‘terminating

statements’
•  http://golang.org/ref/spec#Terminating_statements

www.cloudflare.com!
bufio.Scanner
•  Simple, fast type for doing command tasks like reading

os.Stdin line by line, or reading word by word from a
file
scanner := bufio.NewScanner(os.Stdin)!
!
for scanner.Scan() {!
fmt.Println(scanner.Text()!
}!
!
if err := scanner.Err(); err != nil {!
// Handle error!
}!

•  Built in scanners for lines, words, characters and runes
•  Can provide a custom scanner function

www.cloudflare.com!
Size of int
•  On 64-bit platforms int and uint are now 64 bits
•  Elsewhere they are 32-bits.

•  Couple of consequences:
•  If your code was relying on them being 32-bits then you may have
trouble
x := ^uint32(0)
i := int(x)
!
!
fmt.Println(i)!

!// x is 0xffffffff!
!// i is -1 on 32-bit systems, !
!// 0xffffffff on 64-bit!


•  Slice indexes are ints which means they can have 2 billion
members



www.cloudflare.com!
Heap size and Platforms
•  On 64-bit machines heap can now be tens of GB
•  No change on 32-bit
•  If you were running off tip in recent months you already

had massive heaps
•  Experimental support for: linux/arm, freebsd/arm,

netbsd/386, amd64 and arm, openbsd/386 and
amd64

www.cloudflare.com!
Nanosecond timing




•  FreeBSD, Linux, NetBSD, OpenBSD, OS X time package

has nanosecond precision
•  time.Round and time.Truncate to round up/down to
nearest multiples of any time.Duration
t, _ := time.Parse("2006 Jan 02 15:04:05", "2012 Dec
07 12:15:30.918273645")!
trunc := []time.Duration{!
time.Nanosecond, time.Microsecond,!
time.Millisecond, time.Second,!
2 * time.Second, time.Minute,!
10 * time.Minute, time.Hour, !
}!
for _, d := range trunc {!
fmt.Printf("t.Truncate(%6s) = %sn", d,
t.Truncate(d).Format("15:04:05.999999999"))!
}!
www.cloudflare.com!
Performance
•  Claimed 30 to 40% performance increase over Go 1.0.3


•  Best analysis by Dave Cheney:
•  http://dave.cheney.net/2013/05/21/go-11-performance-

improvements
•  http://dave.cheney.net/2013/05/25/go-11-performanceimprovements-part-2
•  http://dave.cheney.net/2013/05/28/go-11-performanceimprovements-part-3


•  Dave’s summary: 30-40% performance increase is real

www.cloudflare.com!
Performance Highlights
•  Code generation improvements across all three gc

compilers
•  Improvements to inlining
•  Reduction in stack usage
•  Parallel garbage collector. 
•  More precise garbage collection, which reduces the size
of the heap, leading to lower GC pause times.
•  New runtime scheduler; tight integration of the scheduler
with the net package
•  Parts of the runtime and standard library have been
rewritten in assembly to take advantage of specific bulk
move or crypto instructions.
www.cloudflare.com!
Race Detector




•  http://golang.org/doc/articles/race_detector.html
•  Detects concurrent access by two goroutines to the

same variable where one access is write
func main() {!
c := make(chan bool)!
m := make(map[string]string)!
!
go func() {!
m["1"] = "a" // First conflicting access.!
c <- true!
}()!
!
m["2"] = "b" // Second conflicting access.!
<-c!
}!

•  go build –race example.go
www.cloudflare.com!
Full release notes
•  http://golang.org/doc/go1.1


•  Go 1.1 is backwards compatible with Go 1.0.3

•  Go 1.2 targeted for December 1


www.cloudflare.com!

More Related Content

Highlights of Go 1.1

  • 1. Highlights of Go 1.1 May 29, 2013 John Graham-Cumming www.cloudflare.com!
  • 2. Method Values •  Function value bound to specific receiver type Prefixer struct {! prefix string! }! ! func (p Prefixer) Add(s string) string {! return p.prefix + ": " + s! }! ! func main() {! hawaii := Prefixer{"Aloha”}! fmt.Printf("%sn", hawaii.Add("Welcome to Honolulu"))! ! adder := hawaii.Add! fmt.Printf("%sn", adder("Welcome to Honolulu"))! }! www.cloudflare.com!
  • 3. Change to return handling •  return statement not needed at end of functions if function termination is unambiguous func even() int {! for {! if i := rand.Intn(100); i%2 == 0 {! return i! }! }! }! •  Worth reading the specification on ‘terminating statements’ •  http://golang.org/ref/spec#Terminating_statements www.cloudflare.com!
  • 4. bufio.Scanner •  Simple, fast type for doing command tasks like reading os.Stdin line by line, or reading word by word from a file scanner := bufio.NewScanner(os.Stdin)! ! for scanner.Scan() {! fmt.Println(scanner.Text()! }! ! if err := scanner.Err(); err != nil {! // Handle error! }! •  Built in scanners for lines, words, characters and runes •  Can provide a custom scanner function www.cloudflare.com!
  • 5. Size of int •  On 64-bit platforms int and uint are now 64 bits •  Elsewhere they are 32-bits. •  Couple of consequences: •  If your code was relying on them being 32-bits then you may have trouble x := ^uint32(0) i := int(x) ! ! fmt.Println(i)! !// x is 0xffffffff! !// i is -1 on 32-bit systems, ! !// 0xffffffff on 64-bit! •  Slice indexes are ints which means they can have 2 billion members www.cloudflare.com!
  • 6. Heap size and Platforms •  On 64-bit machines heap can now be tens of GB •  No change on 32-bit •  If you were running off tip in recent months you already had massive heaps •  Experimental support for: linux/arm, freebsd/arm, netbsd/386, amd64 and arm, openbsd/386 and amd64 www.cloudflare.com!
  • 7. Nanosecond timing •  FreeBSD, Linux, NetBSD, OpenBSD, OS X time package has nanosecond precision •  time.Round and time.Truncate to round up/down to nearest multiples of any time.Duration t, _ := time.Parse("2006 Jan 02 15:04:05", "2012 Dec 07 12:15:30.918273645")! trunc := []time.Duration{! time.Nanosecond, time.Microsecond,! time.Millisecond, time.Second,! 2 * time.Second, time.Minute,! 10 * time.Minute, time.Hour, ! }! for _, d := range trunc {! fmt.Printf("t.Truncate(%6s) = %sn", d, t.Truncate(d).Format("15:04:05.999999999"))! }! www.cloudflare.com!
  • 8. Performance •  Claimed 30 to 40% performance increase over Go 1.0.3 •  Best analysis by Dave Cheney: •  http://dave.cheney.net/2013/05/21/go-11-performance- improvements •  http://dave.cheney.net/2013/05/25/go-11-performanceimprovements-part-2 •  http://dave.cheney.net/2013/05/28/go-11-performanceimprovements-part-3 •  Dave’s summary: 30-40% performance increase is real www.cloudflare.com!
  • 9. Performance Highlights •  Code generation improvements across all three gc compilers •  Improvements to inlining •  Reduction in stack usage •  Parallel garbage collector. •  More precise garbage collection, which reduces the size of the heap, leading to lower GC pause times. •  New runtime scheduler; tight integration of the scheduler with the net package •  Parts of the runtime and standard library have been rewritten in assembly to take advantage of specific bulk move or crypto instructions. www.cloudflare.com!
  • 10. Race Detector •  http://golang.org/doc/articles/race_detector.html •  Detects concurrent access by two goroutines to the same variable where one access is write func main() {! c := make(chan bool)! m := make(map[string]string)! ! go func() {! m["1"] = "a" // First conflicting access.! c <- true! }()! ! m["2"] = "b" // Second conflicting access.! <-c! }! •  go build –race example.go www.cloudflare.com!
  • 11. Full release notes •  http://golang.org/doc/go1.1 •  Go 1.1 is backwards compatible with Go 1.0.3 •  Go 1.2 targeted for December 1 www.cloudflare.com!