The Go Programming Language Part 1

Rob Pike r@google.com October, 2009

Monday, November 2, 2009

The team
Russ Cox Robert Griesemer Ian Lance Taylor Rob Pike Ken Thompson Plus lots of contributors... contact:
nuts@golang.org: dev@golang.org:

user discussion developers

Monday, November 2, 2009

Course Outline
Day 1 Basics Day 2 Types, methods, and interfaces Day 3 Concurrency and communication This course is about programming in Go, not about programming language design. That could be a separate talk.

Monday, November 2, 2009

mostly familiar stuff Packages and program construction Monday.Today’s Outline Motivation Basics the easy. 2009 . November 2.

2009 .Motivation Monday. November 2.

concurrency poorly supported Multi-core seen as crisis not opportunity Monday. 2009 .Why. briefly? In the current world. November 2. safety Types get in the way too much Garbage collection. languages don't help enough: Computers fast but software construction slow Dependency analysis necessary for speed.

Go New Experimental Concurrent Garbage-collected Systems Language Monday. 2009 . November 2.

flexible type system .In short Our goal is to make programming fun again.has methods but not a conventional OO language Monday. 2009 .lightweight.the feel of a dynamic language with the safety of a static type system . .real run-time that supports GC. November 2. concurrency .compile to machine language so it runs fast .

Resources For more background. November 2.org/ Includes: reference manual tutorial library documentation setup and how-to docs FAQs more Monday. 2009 . see the documentation: http://golang. etc.

concurrency etc. x86-64). November 2. implemented. Garbage collector. 2009 .Status: Compilers 6g (ken) experimental generates OK code very quickly not gcc-linkable gccgo (iant) more traditional generates good code not as quickly gcc-linkable Both are for 64-bit x86 (amd64. ARM underway. Monday. Rudimentary libraries improving fast. support for 32-bit x86 exists.

2009 .Basics Monday. November 2.

2009 . November 2.Time for some code package main import "fmt" func main() { fmt.Print("Hello. 世界\n") } Monday.

here comes a quick tour of the basics. familiar and therefore dull. November 2. Apologies for that. 2009 . The next two lectures contain the fun stuff but we need to lay down the groundwork first. Monday. This will be mostly easy.Language basics Assuming familiarity with other C-like languages.

no nesting */ // So is this. 2009 . Source is UTF-8. Comments: /* This is a comment.Lexical structure Mostly traditional with modern details. newline. White space: blank. Identifiers are alphanumeric (plus ‘_’) with “alpha” and “numeric” defined by Unicode. November 2. Monday. tab.

abc\\t\\" Monday. 2 bytes of UTF-8 Raw strings `\n\. world\n" "\xFF" // 1 byte "\u00FF" // 1 unicode char. both are bytes. but Unicode/UTF-8. 2009 .abc\t\` == "\\n\\.Literals C-like but numbers require no signedness or size markings (more about this soon) 23 0x0FF 1. November 2. \012 always 3. "Hello.234e7 C-like strings. Also \xNN always 2 digits.

November 2. Monday. i < 10. } Note: no parentheses.. 2009 .. plus keywords to introduce each type of declaration. i++ { . but braces required. More about all this later.Syntax overview Basically C-like with reversed types and declarations. c *int // note difference from C var d []int type S struct { a. var a int var b. b int } Basic control structures are familiar: if a == b { return true } else { return false } for i = 0.

November 2. Monday. i) } However.Printf("%d\n".semis not required after closing ) of declaration list .Semicolons Semicolons separate (not terminate) statements but: . 2009 . implicit empty statement allows you to use semicolons the same way as in C if you want.semis not required after } (unless part of expr) Thus no semis needed in this program: package main const three = 3 var i int = three func main() { fmt.semis never required at top (global) level .

an integer big enough to store a pointer. int is not int32 even on a 32-bit machine. Monday. No implicit conversions (but don't panic).Numeric types Numeric types are built in. November 2. These are all distinct types. 2009 . will be familiar: int int8 int16 int32 int64 uint uint8 = byte uint16 uint32 uint64 float32 float64 float Also uintptr.

bool. November 2. The if statement etc. with values true and false (predefined constants).† † Consider (not Go): const bool False = "false" Monday. use boolean expressions. Pointers and integers are not booleans.Bool The usual boolean type. 2009 .

that is. Strings are length-delimited not NUL-terminated. Monday. Just as 3 is always 3. String literals have type string. text. just like ints.String The built-in type string represents immutable arrays of bytes . Language has good support for string manipulation. 2009 . Immutable. "hello" is always "hello". Can reassign variables but not edit values. November 2.

| ^ == != < <= > >= <&& || communication comments &^ is "bit clear" ^ is "xor" Operators that are also unary: & ! * + . Binary operators: Prec. 6 5 4 3 2 1 operators * / % << >> & &^ + . November 2. Monday. 2009 .^ <Unary ^ is complement.Expressions Mostly C-like operators.

etc.Go vs.are not expression operators (x++ is a statement. 2009 . November 2. *p++ is (*p)++ not *(p++)) &^ is new. expressions generally look the same (indexing.) Monday. handy in constant expressions << >> etc. C expressions Surprises for the C programmer: fewer precedence levels (should be easy) ^ instead of ~ (it's binary "exclusive or" made unary) ++ and -. not an expression. require an unsigned shift count Non-surprises: assignment ops work as expected: += <<= &^= etc. function call.

2g\n". " "there" // lexical cat "hello. " + str // dynamic cat Monday. 2009 .Examples +x 23 + 3*x[i] x <= f() ^a >> b f() || g() x == y + 1 && <-chan_ptr > 0 x &^ 7 // x with the low 3 bits cleared fmt. 2*math.Sin(PI/8)) "hello" ". November 2.Printf("%5.

November 2. with syntax like a function call: uint8(int_var) // truncate to size int(float_var) // truncate fraction float64(int_var) // convert to float Also some conversions to string: string(0x1234) string(array_of_bytes) string(array_of_ints) // == "\u1234" // bytes -> bytes // ints -> Unicode/UTF-8 Monday.Numeric conversions Converting a numeric value from one type to another is a conversion. 2009 .

Constants Numeric constants are "ideal numbers": no size or sign. hence no l or u or ul endings.234e5 1e2 100 // floating-point // integer Monday. syntax of literal determines type: 1. 077 // octal 0xFEEDBEEEEEEEEEEEEEEEEEEEEF 1 << 100 // hexadecimal There are integer and floating-point ideal numbers. November 2. 2009 .

November 2. The operations themselves also depend on the type.693147180559945309417232121458\ = 176568075500134360255254120680009 const Log2E 1/Ln2 // accurate reciprocal = Representation is "big enough" (1024 bits now).28 // floating point: 1.14 3. Monday.Constant Expressions Floating point and integer constants can be combined at will.5 // integer: 1 // high precision: const Ln2 0. with the type of the resulting expression determined by the type of the constants. 2*3. 2009 ./2 3/2 // floating point: 6.

5) Monday. uint8(^0) ^uint8(0) uint8(350) uint8(35.The language permits the use of constants without explicit conversion if the value can be represented (there's no conversion necessary.0) uint8(3.5 can't be represented . Example: ^0 is -1 which is not in range 0-255.Sin(1) // float constant Consequences of ideal numbers Constants must be representable in their type. November 2. 2009 // // // // // bad: -1 can't be represented OK bad: 350 can't be represented OK: 35 bad: 3. the value is OK): var million int = 1e6 math.

q *int Also functions read better and are consistent with other declarations. type. func) and look reversed compared to C: var i int const PI = 22. November 2. 2009 . coming up. b int) int { return a + b } Why are they reversed? Earlier example: var p./7. const.Declarations Declarations are introduced by a keyword (var. y int } func sum(a. And there's another reason. Monday. type Point struct { x.

They may have a type or an initialization expression. stringer = 1. Initializers must match variables (and types!). one or both must be present. floater. 2009 .245 k int = 0 l. m uint64 = 1. 2. 2 billion int64 = 1e9 // float constant! inter. "hi" Monday.0. November 2. var var var var var var i int j = 365.Var Variable declarations are introduced by var.

stringer = 1. November 2. l. "hi" ) Applies to const. floater.245. 2.Distributing var Annoying to type var all the time. inter. k int = 0. j = 356. Group with parens! Need semicolons as separators. 2. type. billion int64 = 1e9.0. var ( i int. 2009 . m uint64 = 1. var Monday.

b. "three". get int or float. FOUR These are used a lot and are available in places such as for loop initializers.) a. d := 1. c. declarations of the form var v = value can be shortened to v := value (Another reason for the name/type reversal.0. Monday.) The type is that of the value (for ideal numbers. accordingly. 2009 .The := "short declaration" Within functions (only). 2. November 2.

Const Constant declarations are introduced by const. 2. 2009 . parsnip = "meat". 5. Tuesday. November 2. evaluated at compile time. Wednesday = 1. const Pi = 22./113 const beef./7. as initializer and may have an optional type specifier. Saturday = 4. two. 3. Friday. Thursday. ) Monday. They must have a "constant expression". const AccuratePi float64 = 355. 6. "veg" const ( Monday. 2.

1<<iota.Iota Constant declarations can use the counter iota. const ( Monday = iota. November 2. which starts at 0 in each const block and increments at each semicolon. loc2. 1 // 1. ) // 0 // 1 Shorthand: Previous type and expressions repeat. 2 // 2. Tuesday = iota. loc1. bit2. ) // 0. bit0 uint32 = iota. bit1. 2009 . const ( loc0. 4 Monday.

Type
Type declarations are introduced by type. We'll learn more about types later but here are some examples:
type Point struct { x, y, z float; name string } type Operator func(a, b int) int type ArrayOfIntPointers []*int

We'll come back to functions a little later.

Monday, November 2, 2009

New
The new() operator allocates memory. Syntax is like a function call, with type as argument, similar to C++. Returns a pointer to the allocated object.
var p *Point = new(Point) v := new(int) // v has type *int

Later we'll see how to build arrays and such. There is no delete or free; Go has garbage collection.

Monday, November 2, 2009

Assignment
Assignment is easy and familiar:
a = b

But multiple assignment works too:
x, y, z = f1(), f2(), f3() a, b = b, a

Functions can return multiple values (details later):
nbytes, error := Write(buf)

Monday, November 2, 2009

For instance. Monday. 2009 . no parentheses. for and switch all accept initialization statements. November 2. As stated before. but different in significant ways. They are quite regular when seen as a set. if. for and switch (plus one more to appear later). Go has if.Control structures Similar to C. but braces mandatory.

b. for has 1. 2009 .c {} In any of these forms.and 3-element forms: single is C's while: for a {} triple is C's for: for a.Forms of control structures Details follow but in general: if and switch come in 1. Monday. described below. any element can be empty.and 2-element forms. November 2.

. v) } Useful with multivariate functions: if n.Write(buf).Printf("%d not less than 10".If Basic form is familiar. err != nil { . November 2. Monday. which is not too useful in this context but handy in for. if v := f().Printf("%d less than 10\n".. 2009 . requires semicolon. err = fd. switch. } Missing condition means true. v < 10 { fmt. but no dangling else problem: if x < 5 { less() } if x < 5 { less() } else if x == 5 { equal() } Initialization statement allowed. v) } else { fmt.

Printf("looping forever") } But you can leave out the semis too: for { fmt.} (There's no comma operator as in C. } Missing condition means true: for .For Basic form is familiar: for i := 0.Printf("Mine! ") } Don't forget multivariate assigments: for i... i++ { .j = i+1. November 2. i < 10.N.) Monday..j := 0. 2009 . i... i < j. { fmt.j-1 {.

multiple cases can be comma-separated switch case case case case case } Monday. .expressions need not be constants or even ints.no automatic fall through . fallthrough. . 3: a *= v. 2: a *= v. lexically last statement can be fallthrough . But there are important differences: .Switch details Switches are superficially similar to C's. fallthrough.6: error(). fallthrough. November 2. 2009 count%7 { 4.5. 1: a *= v. 0: return a*v.instead.

switch { case a < b: return -1 case a == b: return 0 case a > b: return 1 } switch a. b := x[i]. } or Monday. Familiar form: switch a { case 0: fmt.. 2009 . { . b := x[i].. November 2.Printf("0") default: fmt.Switch Switch is more powerful than in C. Result: if-else chain: a. y[j].Printf("non-zero") } The expressions can be any type and a missing switch expression means true. y[j].

The break and continue statements work as in C. 1. i < 10. 2: break Loop } g(i) } Yes Ken. etc. there is a goto. November 2. They may specify a label to affect an outer structure: Loop: for i := 0. Monday.Break. i++ { switch f(i) { case 0. continue. 2009 .

bool) { if f >= 0 { return math. if any. 2009 . November 2. comes after parameters. If so. Return type. the return types are a parenthesized list. func MySqrt(f float) (float.Sqrt(f). func square(f float) float { return f*f } A function can return multiple values. true } return 0. The return does as you expect.Functions Functions are introduced by the func keyword. false } Monday.

November 2. more in a sec).ok = 0.ok = math. according to type.ok } Monday.true } return v.0.ok = math. 2009 . func MySqrt(f float) (v float.Functions with result variables The result "parameters" are actual variables you can use if you name them. 0. ok bool) { if f >= 0 { v.Sqrt(f). func MySqrt(f float) (v float.ok } The result variables are initialized to "zero" (0.false } return v. false etc. ok bool) { if f >= 0 { v.Sqrt(f).true } else { v.

Sqrt(f).true } Monday. a return with no expressions returns the existing value of the result variables.The empty return Finally. November 2. Two more versions of MySqrt: func MySqrt(f float) (v float.Sqrt(f). ok bool) { if f < 0 { return } // error case return math. ok bool) { if f >= 0 { v.true } return // must be explicit } func MySqrt(f float) (v float. 2009 .ok = math.

What was that about zero? All memory in Go is initialized. Monday. Without an initializing expression. 2009 . 0. 0. v = 5 } will print 0. etc. the "zero value" of the type is used. 0. fmt.Printf("%d\n". i++ { var v int. zeroed struct. empty string. false. 0. nil pointer. i < 5. floating point 0. The loop for i := 0. All variables are initialized upon execution of their declaration. November 2. v). The zero value depends on the type: integer 0.0.

2009 . November 2. unlocking mutexes. The arguments are evaluated at the point of the defer. func data(name string) string { f := os.O_RDONLY. os. the function call happens upon return.Close(). Monday. etc.Open(name. } Useful for closing fds. 0). return contents. contents := io. defer f.Defer The defer statement executes a function (or method) when the enclosing function returns.ReadAll(f).

i++ { defer fmt. i < 5. You can close all those FDs or unlock those mutexes at the end.One function invocation per defer Each defer that executes queues a function call to execute.Printf("%d ". Monday. i) } } prints 4 3 2 1 0. so func f() { for i := 0. November 2. 2009 . in LIFO order.

Print("in b"). } func a() { trace("a"). s).Tracing with defer func trace(s string) { Print("entering:". 2009 . November 2.. defer untrace("b"). Monday. Print("in a") } func b() { trace("b"). } func untrace(s string) { Print("leaving:".. a() } func main() { b() } But we can do it more neatly. defer untrace("a"). s).

Args evaluate now. s) } func a() { defer un(trace("a")). Print("in a") } func b() { defer un(trace("b")). s). Print("in b"). return s } func un(s string) { Print("leaving:". a() } func main() { b() } Monday. 2009 . November 2. defer later func trace(s string) string { Print("entering:".

func f() { for i := 0.i) }.Function literals As in C. } } Monday. 2009 . i < 10. g(i).Printf("%d". i++ { g := func(i int) { fmt. November 2. functions can't be declared inside functions but function literals can be assigned to variables.

fmt.Print(f(1)).accumulating in f's x Monday.Print(f(20)). 2009 . November 2. func adder() (func(int) int) { var x int. fmt.Print(f(300)). return func(delta int) int { x += delta. fmt. return x } } var f = adder(). Prints 1 21 321 .Function literals are closures Function literals are indeed closures.

November 2. 2009 .Program construction Monday.

A package may be built from multiple source files.Packages A program is constructed as a "package". Monday. November 2. Names in imported packages are accessed through a "qualified identifier": packagename. A Go program is created by linking together a set of packages. which may use facilities from other packages.Itemname. 2009 .

2009 .Source file structure Every source file contains: . package fmt .zero or more global or "package-level" declarations.a package clause (which package it's in). that name is the default name used by importers. November 2. Monday.an optional set of import declarations import "fmt" // use default name import my_fmt "fmt" // use the name my_fmt .

2009 . 世界\n" func main() { fmt.Print(hello) } // fmt is imported pkg name Monday. November 2.A single-file package package main // this file is part of package "main" import "fmt" // this file uses package "fmt" const hello = "Hello.

The program exits immediately and successfully . The main.main returns. 2009 . analogous with the global main() in C.when main. C++. is where execution starts. Monday.main function takes no arguments and returns no value. November 2. after initialization.main() Each Go program contains one package called main and its main function.main and main.

i < len(os. etc.) // A version of echo(1) package main import ("fmt". os. November 2.Printf("arg %d: %s\n". i++ { fmt.Os Package os provides Exit() and access to file I/O.Args[i]) } } // falling off end == os. command-line arguments. (Flag package appears shortly.Args) < 2 { // length of array os. "os") func main() { if len(os.Exit(1) } for i := 1.Args). 2009 .Exit(0) Monday. i.

and constants are visible from all the package's source files. const hello = "you smell" const Hello = "you smell nice" const _Bye = "stinko!" // package visible // globally visible // _ is not upper Very different from C/C++: no extern. types. functions. For clients (importers) of the package. public. Monday. static. 2009 . all global variables. functions. constants. names must be upper case to be visible: global variables.Global and package scope Within a package. plus methods and structure fields for global variables and types. November 2. types. private.

November 2. Monday.Initialization Two ways to initialize global variables before execution of main. 2009 . Initialization is always single-threaded.main: 1) A global declaration with an initializer 2) An init() function. Package dependency guarantees correct execution order. as many as one per source file.

Pi // decl computes twoPi func main() { fmt. } ==== Output: 2*Pi = 6. November 2.Atan(1) // init() function computes Pi } ==== package main import ( "fmt".283185307179586 Monday. twoPi). "transcendental" ) var twoPi = 2*transcendental.Initialization example package transcendental import "math" var Pi float64 func init() { Pi = 4*math. 2009 .Printf("2*Pi = %g\n".

2009 . Package dependencies determine the order in which to build packages. must be compiled in the correct order. the packages. and conventionally each directory contains one package. cd my_package 6g *.Package and program construction To build a program. November 2. The package is compiled as a unit. and the files within them. Within a package. Ignoring tests. Monday.go Usually we use make. the source files must (conceptually at least) all be compiled together.

Building the fmt package % pwd /Users/r/go/src/pkg/fmt % ls Makefile fmt_test.go % make # hand-written but trivial % ls Makefile _go_.. November 2.go format.go print.pkg etc. make .go print.go format. Makefiles are written using helpers called Make. 2009 . see sources Monday... Objects go into the subdirectory _obj.6 _obj fmt_test.go % make clean.

go. gotest. Within those files. error reporting. write a set of Go source files within the same package. Those functions should have signature func TestXxxx(t *testing. November 2.Testing To test a package. 2009 . global functions with names starting Test[^a-z]* will be run by the testing tool. Monday. give the files names of the form *_test.T) The "testing" package provides support for logging.

tt.out) } } } % Monday.easy to understand.out { // method call coming up .go package fmt // package is fmt.Errorf("Sprintf(%q. November 2. 2009 . not main import ( "testing" ) func TestFlagParser(t *testing. &flagprinter). s := Sprintf(tt.T) { var flagprinter flagPrinter.in.An example test % grep "interesting_bits" fmt_test. t.in." " want %q". i++ { tt := flagtests[i]. for i := 0. &flagprinter) => %q. s. if s != tt. tt. i < len(flagtests).

go % gotest # by default.PASS: fmt.go format.go --chatty === RUN fmt.PASS: fmt.TestFlagParser --.PASS: fmt. does all *_test.TestStructPrinter === RUN fmt. November 2. 2009 .PASS: fmt.go PASS wally=% gotest fmt_test.a fmt_test.TestSprintf --.PASS: fmt.TestSprintf PASS % Monday.go print.TestArrayPrinter === RUN fmt.TestFlagParser === RUN fmt.Testing: gotest % ls Makefile fmt.TestFmtInterface --.TestFmtInterface === RUN fmt.TestStructPrinter --.TestArrayPrinter --.

Itoa Copy. Match Parse. flag event logging log regular expressions regexp HTML. Stderr Compile. Atof. 2009 . Buffer formatted I/O fmt OS interface os strconv numbers <-> strings generic I/O io flags: --help etc.Libraries Libraries are just packages. November 2. template byte arrays bytes Monday. The set of libraries is modest but growing. Read. String Log. Execute Compare. Logf. Write Atoi. Pipe Bool. Some examples: Package Purpose Examples Printf. Sprintf Open. etc.

no format. " ".5) fmt. Fprintln . 1. November 2.Stderr etc. " ". adds spaces.Print(1. 2. "\n") fmt. Sprintln.A little more about fmt The fmt package contains familiar names in initial caps: Printf . 2009 . 2. Fprint .returns a string Fprintf .5) Each produces the same result: "1 2 3. final \n fmt. (tomorrow) but also Print. 3.Printf("%d %d %g\n".operates on os. 2. 3.5\n" Monday.no format Println.print to standard output Sprintf .Println(1.5. Sprint. 3.

Command line or web tool pulls them out. November 2.Library documentation Source code contains comments. Link: http://golang. 2009 .org/pkg/ Command: % godoc fmt % godoc fmt Printf Monday.

Exercise Monday. November 2. 2009 .

make the operation settable by a function provided by the user. Monday. You all know what the Fibonacci series is. November 2.) But instead of addition. There should be a function to get the next value.Exercise: Day 1 Set up a client. 2009 . (You don't have structs yet. Integers? Floats? Strings? Up to you. so use some globals to store state. Write a package to implement it. Write a gotestable test for your package.

Next lesson Composite types Methods Interfaces Monday. November 2. 2009 .

The Go Programming Language Part 1 Rob Pike r@google. November 2. 2009 .com October 2009 Monday.

Master your semester with Scribd & The New York Times

Special offer for students: Only $4.99/month.

Master your semester with Scribd & The New York Times

Cancel anytime.