SlideShare ist ein Scribd-Unternehmen logo
1 von 74
Downloaden Sie, um offline zu lesen
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:     user discussion
                            dev@golang.org:      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
Today’s Outline

                Motivation

                Basics
                 the easy, mostly familiar stuff

                Packages and program construction




Monday, November 2, 2009
Motivation




Monday, November 2, 2009
Why, briefly?

        In the current world, languages don't help enough:

            Computers fast but software construction slow

            Dependency analysis necessary for speed, safety

            Types get in the way too much

            Garbage collection, concurrency poorly supported

            Multi-core seen as crisis not opportunity



Monday, November 2, 2009
Go

                       New

                       Experimental

                       Concurrent

                       Garbage-collected

                       Systems

                       Language



Monday, November 2, 2009
In short
     Our goal is to make programming fun again.

         - the feel of a dynamic language with the safety of
         a static type system

         - compile to machine language so it runs fast

         - real run-time that supports GC, concurrency

         - lightweight, flexible type system

         - has methods but not a conventional OO language



Monday, November 2, 2009
Resources

          For more background, etc. see the documentation:

              http://golang.org/

          Includes:

              -    reference manual
              -    tutorial
              -    library documentation
              -    setup and how-to docs
              -    FAQs
              -    more


Monday, November 2, 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, x86-64); support
         for 32-bit x86 exists; ARM underway.

         Garbage collector, concurrency etc. implemented.
         Rudimentary libraries improving fast.


Monday, November 2, 2009
Basics




Monday, November 2, 2009
Time for some code


                           package main

                           import "fmt"

                           func main() {
                             fmt.Print("Hello,   n")
                           }




Monday, November 2, 2009
Language basics


    Assuming familiarity with other C-like languages,
    here comes a quick tour of the basics.

    This will be mostly easy, familiar and therefore dull.
    Apologies for that.

    The next two lectures contain the fun stuff but we
    need to lay down the groundwork first.




Monday, November 2, 2009
Lexical structure

                       Mostly traditional with modern details.

                       Source is UTF-8. White space: blank, tab,
                       newline.

                       Identifiers are alphanumeric (plus ‘_’) with
                       “alpha” and “numeric” defined by Unicode.

                       Comments:

                           /* This is a comment; no nesting */
                           // So is this.


Monday, November 2, 2009
Literals
       C-like but numbers require no signedness or size
       markings (more about this soon)
            23
            0x0FF
            1.234e7

       C-like strings, but Unicode/UTF-8. Also xNN
       always 2 digits; 012 always 3; both are bytes.

            "Hello, worldn"
            "xFF"    // 1 byte
            "u00FF" // 1 unicode char, 2 bytes of UTF-8

       Raw strings
            `n.abct` == "n.abct"

Monday, November 2, 2009
Syntax overview
     Basically C-like with reversed types and declarations,
     plus keywords to introduce each type of declaration.

          var a int
          var b, c *int // note difference from C
          var d []int
          type S struct { a, b int }

     Basic control structures are familiar:

          if a == b { return true } else { return false }
          for i = 0; i < 10; i++ { ... }

     Note: no parentheses, but braces required.

     More about all this later.
Monday, November 2, 2009
Semicolons
     Semicolons separate (not terminate) statements but:
     - semis never required at top (global) level
     - semis not required after closing ) of declaration list
     - 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.Printf("%dn", i) }

     However, implicit empty statement allows you to use
     semicolons the same way as in C if you want.
Monday, November 2, 2009
Numeric types
     Numeric types are built in, will be familiar:

                            int          uint        float
                           int8      uint8 = byte
                           int16        uint16
                           int32        uint32      float32
                           int64        uint64      float64

   Also uintptr, an integer big enough to store a pointer.
   These are all distinct types; int is not int32 even on
   a 32-bit machine.
   No implicit conversions (but don't panic).

Monday, November 2, 2009
Bool

     The usual boolean type, bool, with values true and
     false (predefined constants).

     The if statement etc. use boolean expressions.

     Pointers and integers are not booleans.†




     † Consider (not Go): const bool False = "false"




Monday, November 2, 2009
String
     The built-in type string represents immutable arrays
     of bytes - that is, text. Strings are length-delimited
     not NUL-terminated.

     String literals have type string.

     Immutable, just like ints. Can reassign variables but
     not edit values.

     Just as 3 is always 3, "hello" is always "hello".

     Language has good support for string manipulation.



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

                           2   &&
                           1   ||

        Operators that are also unary: & ! * + - ^ <-
        Unary ^ is complement.

Monday, November 2, 2009
Go vs. C expressions
   Surprises for the C programmer:

        fewer precedence levels (should be easy)
          ^ instead of ~ (it's binary "exclusive or" made unary)
        ++ and -- are not expression operators
          (x++ is a statement, not an expression;
          *p++ is (*p)++ not *(p++))
        &^ is new; handy in constant expressions
        << >> etc. require an unsigned shift count

   Non-surprises:
    assignment ops work as expected: += <<= &^= etc.
    expressions generally look the same (indexing,
     function call, etc.)

Monday, November 2, 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.Printf("%5.2gn", 2*math.Sin(PI/8))

               "hello" ", " "there" // lexical cat
               "hello, " + str      // dynamic cat




Monday, November 2, 2009
Numeric conversions

   Converting a numeric value from one type to another
   is a conversion, 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)               // == "u1234"
       string(array_of_bytes)       // bytes -> bytes
       string(array_of_ints)        // ints -> Unicode/UTF-8




Monday, November 2, 2009
Constants

     Numeric constants are "ideal numbers": no size or
     sign, hence no l or u or ul endings.

          077 // octal
          0xFEEDBEEEEEEEEEEEEEEEEEEEEF         // hexadecimal
          1 << 100

     There are integer and floating-point ideal numbers;
     syntax of literal determines type:

          1.234e5
          1e2              // floating-point
          100              // integer


Monday, November 2, 2009
Constant Expressions
       Floating point and integer constants can be
       combined at will, with the type of the resulting
       expression determined by the type of the constants.
       The operations themselves also depend on the type.

            2*3.14         // floating point: 6.28
            3./2           // floating point: 1.5
            3/2            // integer: 1

            // high precision:
            const Ln2
 0.693147180559945309417232121458
                     =
                     176568075500134360255254120680009
            const Log2E
 1/Ln2 // accurate reciprocal
                       =

       Representation is "big enough" (1024 bits now).

Monday, November 2, 2009
Consequences of ideal numbers
         The language permits the use of constants
         without explicit conversion if the value can be
         represented (there's no conversion necessary; the
         value is OK):

               var million int = 1e6     // float constant
               math.Sin(1)

         Constants must be representable in their type.
         Example: ^0 is -1 which is not in range 0-255.
               uint8(^0)     //   bad: -1 can't be represented
               ^uint8(0)     //   OK
               uint8(350)    //   bad: 350 can't be represented
               uint8(35.0)   //   OK: 35
               uint8(3.5)    //   bad: 3.5 can't be represented

Monday, November 2, 2009
Declarations
         Declarations are introduced by a keyword (var,
         const, type, func) and look reversed compared to C:

              var i int
              const PI = 22./7.
              type Point struct { x, y int }
              func sum(a, b int) int { return a + b }

         Why are they reversed? Earlier example:

              var p, q *int

         Also functions read better and are consistent with
         other declarations. And there's another reason,
         coming up.

Monday, November 2, 2009
Var
         Variable declarations are introduced by var.

         They may have a type or an initialization expression;
         one or both must be present. Initializers must
         match variables (and types!).

              var          i int
              var          j = 365.245
              var          k int = 0
              var          l, m uint64 = 1, 2
              var          billion int64 = 1e9 // float constant!
              var          inter, floater, stringer = 1, 2.0, "hi"




Monday, November 2, 2009
Distributing var
         Annoying to type var all the time. Group with
         parens! Need semicolons as separators.

              var (
                i int;
                j = 356.245;
                k int = 0;
                l, m uint64 = 1, 2;
                billion int64 = 1e9;
                inter, floater, stringer = 1, 2.0, "hi"
              )

         Applies to const, type, var



Monday, November 2, 2009
The := "short declaration"
      Within functions (only), declarations of the form
          var v = value
      can be shortened to
          v := value
      (Another reason for the name/type reversal.)

      The type is that of the value (for ideal numbers, get
      int or float, accordingly.)
          a, b, c, d := 1, 2.0, "three", FOUR
      These are used a lot and are available in places such
      as for loop initializers.


Monday, November 2, 2009
Const
         Constant declarations are introduced by const.

         They must have a "constant expression", evaluated
         at compile time, as initializer and may have an
         optional type specifier.

              const Pi = 22./7.
              const AccuratePi float64 = 355./113
              const beef, two, parsnip = "meat", 2, "veg"

              const (
                Monday, Tuesday, Wednesday = 1, 2, 3;
                Thursday, Friday, Saturday = 4, 5, 6;
              )


Monday, November 2, 2009
Iota
         Constant declarations can use the counter iota,
         which starts at 0 in each const block and increments
         at each semicolon.
              const (
                Monday = iota;    // 0
                Tuesday = iota;   // 1
              )

         Shorthand: Previous type and expressions repeat.
              const (
                loc0, bit0 uint32 = iota, 1<<iota;   // 0, 1
                loc1, bit1;                          // 1, 2
                loc2, bit2;                          // 2, 4
              )


Monday, November 2, 2009
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
Control structures

                Similar to C, but different in significant ways.

                Go has if, for and switch (plus one more to
                appear later).

                As stated before, no parentheses, but braces
                mandatory.

                They are quite regular when seen as a set.
                For instance, if, for and switch all accept
                initialization statements.



Monday, November 2, 2009
Forms of control structures

                Details follow but in general:

                if and switch come in 1- and 2-element
                forms, described below.

                for has 1- and 3-element forms:
                     single is C's while:
                         for a {}
                     triple is C's for:
                         for a;b;c {}

                In any of these forms, any element can be
                empty.

Monday, November 2, 2009
If
   Basic form is familiar, but no dangling else problem:
         if x < 5 { less() }
         if x < 5 { less() } else if x == 5 { equal() }

   Initialization statement allowed; requires semicolon.
         if v := f(); v < 10 {
           fmt.Printf("%d less than 10n", v)
         } else {
           fmt.Printf("%d not less than 10", v)
         }

   Useful with multivariate functions:
         if n, err = fd.Write(buf); err != nil { ... }

   Missing condition means true, which is not too
   useful in this context but handy in for, switch.
Monday, November 2, 2009
For
     Basic form is familiar:
           for i := 0; i < 10; i++ { ... }

     Missing condition means true:
           for ;; { fmt.Printf("looping forever") }

     But you can leave out the semis too:

           for { fmt.Printf("Mine! ") }

     Don't forget multivariate assigments:

           for i,j := 0,N; i < j; i,j = i+1,j-1 {...}

     (There's no comma operator as in C.)
Monday, November 2, 2009
Switch details
  Switches are superficially similar to C's.

  But there are important differences:
  - expressions need not be constants or even ints.
  - no automatic fall through
  - instead, lexically last statement can be fallthrough
  - multiple cases can be comma-separated

        switch             count%7 {
          case             4,5,6: error();
          case             3: a *= v; fallthrough;
          case             2: a *= v; fallthrough;
          case             1: a *= v; fallthrough;
          case             0: return a*v;
        }

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


Monday, November 2, 2009
Break, continue, etc.

     The break and continue statements work as in C.

     They may specify a label to affect an outer structure:

           Loop: for i := 0; i < 10; i++ {
             switch f(i) {
               case 0, 1, 2: break Loop
             }
             g(i)
           }

     Yes Ken, there is a goto.



Monday, November 2, 2009
Functions

          Functions are introduced by the func keyword.
          Return type, if any, comes after parameters. The
          return does as you expect.

               func square(f float) float { return f*f }

          A function can return multiple values. If so, the
          return types are a parenthesized list.

               func MySqrt(f float) (float, bool) {
                 if f >= 0 { return math.Sqrt(f), true }
                 return 0, false
               }


Monday, November 2, 2009
Functions with result variables
          The result "parameters" are actual variables you
          can use if you name them.

               func MySqrt(f float) (v float, ok bool) {
                 if f >= 0 { v,ok = math.Sqrt(f),true }
                 else { v,ok = 0,false }
                 return v,ok
               }

          The result variables are initialized to "zero" (0,
          0.0, false etc. according to type; more in a sec).

               func MySqrt(f float) (v float, ok bool) {
                 if f >= 0 { v,ok = math.Sqrt(f),true }
                 return v,ok
               }
Monday, November 2, 2009
The empty return

          Finally, a return with no expressions returns the
          existing value of the result variables. Two more
          versions of MySqrt:

               func MySqrt(f float) (v float, ok bool) {
                 if f >= 0 { v,ok = math.Sqrt(f),true }
                 return // must be explicit
               }

               func MySqrt(f float) (v float, ok bool) {
                 if f < 0 { return } // error case
                 return math.Sqrt(f),true
               }


Monday, November 2, 2009
What was that about zero?
            All memory in Go is initialized. All variables are
            initialized upon execution of their declaration.
            Without an initializing expression, the "zero
            value" of the type is used. The loop
                 for i := 0; i < 5; i++ {
                   var v int;
                   fmt.Printf("%dn", v);
                   v = 5
                 }
            will print 0, 0, 0, 0, 0.

            The zero value depends on the type: integer 0,
            floating point 0.0, false, empty string, nil
            pointer, zeroed struct, etc.


Monday, November 2, 2009
Defer

     The defer statement executes a function (or method)
     when the enclosing function returns. The arguments
     are evaluated at the point of the defer; the function
     call happens upon return.

          func data(name string) string {
            f := os.Open(name, os.O_RDONLY, 0);
            defer f.Close();
            contents := io.ReadAll(f);
            return contents;
          }

     Useful for closing fds, unlocking mutexes, etc.


Monday, November 2, 2009
One function invocation per defer

    Each defer that executes queues a function call to
    execute, in LIFO order, so


          func f() {
            for i := 0; i < 5; i++ {
              defer fmt.Printf("%d ", i)
            }
          }

    prints 4 3 2 1 0. You can close all those FDs or
    unlock those mutexes at the end.



Monday, November 2, 2009
Tracing with defer
     func trace(s string) { Print("entering:", s); }
     func untrace(s string) { Print("leaving:", s); }
     func a() {
     
 trace("a");
       defer untrace("a");
       Print("in a")
     }
     func b() {
       trace("b");
       defer untrace("b");
       Print("in b");
       a()
     }
     func main() { b() }

     But we can do it more neatly...
Monday, November 2, 2009
Args evaluate now, defer later
     func trace(s string) string {
     
 Print("entering:", s);
       return s
     }
     func un(s string) {
       Print("leaving:", s)
     }
     func a() {
     
 defer un(trace("a"));
       Print("in a")
     }
     func b() {
     
 defer un(trace("b"));
       Print("in b");
       a()
     }
     func main() { b() }
Monday, November 2, 2009
Function literals

     As in C, functions can't be declared inside functions -
     but function literals can be assigned to variables.

          func f() {
            for i := 0; i < 10; i++ {
              g := func(i int) { fmt.Printf("%d",i) };
              g(i);
            }
          }




Monday, November 2, 2009
Function literals are closures

     Function literals are indeed closures.

          func adder() (func(int) int) {
            var x int;
            return func(delta int) int {
              x += delta;
              return x
            }
          }
          var f = adder();
          fmt.Print(f(1));
          fmt.Print(f(20));
          fmt.Print(f(300));
     Prints 1 21 321 - accumulating in f's x
Monday, November 2, 2009
Program construction




Monday, November 2, 2009
Packages

         A program is constructed as a "package", which
         may use facilities from other packages.

         A Go program is created by linking together a set
         of packages.

         A package may be built from multiple source files.

         Names in imported packages are accessed through
         a "qualified identifier": packagename.Itemname.




Monday, November 2, 2009
Source file structure

         Every source file contains:

             - a package clause (which package it's in); that
             name is the default name used by importers.
                 package fmt

             - an optional set of import declarations
                 import "fmt" // use default name
                 import my_fmt "fmt" // use the name my_fmt

             - zero or more global or "package-level"
             declarations.


Monday, November 2, 2009
A single-file package


  package main // this file is part of package "main"

  import "fmt" // this file uses package "fmt"

  const hello = "Hello,               n"
  func main() {
    fmt.Print(hello)             // fmt is imported pkg name
  }




Monday, November 2, 2009
main and main.main()


         Each Go program contains one package called main
         and its main function, after initialization, is where
         execution starts, analogous with the global main()
         in C, C++.

         The main.main function takes no arguments and
         returns no value. The program exits -
         immediately and successfully - when main.main
         returns.




Monday, November 2, 2009
Os
     Package os provides Exit() and access to file I/O,
     command-line arguments, etc. (Flag package
     appears shortly.)
    // A version of echo(1)
    package main

    import ("fmt"; "os")

    func main() {
      if len(os.Args) < 2 { // length of array
        os.Exit(1)
      }
      for i := 1; i < len(os.Args); i++ {
        fmt.Printf("arg %d: %sn", i, os.Args[i])
      }
    } // falling off end == os.Exit(0)
Monday, November 2, 2009
Global and package scope
     Within a package, all global variables, functions,
     types, and constants are visible from all the
     package's source files.

     For clients (importers) of the package, names must
     be upper case to be visible: global variables,
     functions, types, constants, plus methods and
     structure fields for global variables and types.

     const hello = "you smell"            // package visible
     const Hello = "you smell nice"       // globally visible
     const _Bye = "stinko!"               // _ is not upper

     Very different from C/C++: no extern, static,
     private, public.
Monday, November 2, 2009
Initialization
     Two ways to initialize global variables before
     execution of main.main:

     1) A global declaration with an initializer
     2) An init() function, as many as one per source file.

     Package dependency guarantees correct execution
     order.

     Initialization is always single-threaded.




Monday, November 2, 2009
Initialization example
     package transcendental
     import "math"
     var Pi float64
     func init() {
         Pi = 4*math.Atan(1) // init() function computes Pi
     }
     ====
     package main
     import (
         "fmt";
         "transcendental"
     )
     var twoPi = 2*transcendental.Pi // decl computes twoPi
     func main() {
         fmt.Printf("2*Pi = %gn", twoPi);
     }
     ====
     Output: 2*Pi = 6.283185307179586
Monday, November 2, 2009
Package and program construction
     To build a program, the packages, and the files
     within them, must be compiled in the correct order.

     Package dependencies determine the order in which
     to build packages.

     Within a package, the source files must (conceptually
     at least) all be compiled together. The package is
     compiled as a unit, and conventionally each directory
     contains one package. Ignoring tests,
              cd my_package
              6g *.go

     Usually we use make.
Monday, November 2, 2009
Building the fmt package
  % pwd
  /Users/r/go/src/pkg/fmt
  % ls
  Makefile fmt_test.go format.go print.go
  % make # hand-written but trivial
  % ls
  Makefile _go_.6 _obj fmt_test.go format.go print.go
  % make clean; make
  ...

  Objects go into the subdirectory _obj.

  Makefiles are written using helpers called Make.pkg
  etc.; see sources

Monday, November 2, 2009
Testing
     To test a package, write a set of Go source files
     within the same package; give the files names of the
     form *_test.go.

     Within those files, global functions with names
     starting Test[^a-z]* will be run by the testing tool,
     gotest. Those functions should have signature

         func TestXxxx(t *testing.T)

     The "testing" package provides support for logging,
     error reporting.



Monday, November 2, 2009
An example test
     % grep "interesting_bits" fmt_test.go
     package fmt // package is fmt, not main
     import (
       "testing"
     )
     func TestFlagParser(t *testing.T) {
       var flagprinter flagPrinter;
       for i := 0; i < len(flagtests); i++ {
         tt := flagtests[i];
         s := Sprintf(tt.in, &flagprinter);
         if s != tt.out {
           // method call coming up - easy to understand.
           t.Errorf("Sprintf(%q, &flagprinter) => %q,"
                    " want %q", tt.in, s, tt.out)
         }
       }
     }
     %
Monday, November 2, 2009
Testing: gotest
    % ls
    Makefile fmt.a fmt_test.go format.go print.go
    % gotest # by default, does all *_test.go
    PASS
    wally=% gotest fmt_test.go --chatty
    === RUN fmt.TestFlagParser
    --- PASS: fmt.TestFlagParser
    === RUN fmt.TestArrayPrinter
    --- PASS: fmt.TestArrayPrinter
    === RUN fmt.TestFmtInterface
    --- PASS: fmt.TestFmtInterface
    === RUN fmt.TestStructPrinter
    --- PASS: fmt.TestStructPrinter
    === RUN fmt.TestSprintf
    --- PASS: fmt.TestSprintf
    PASS
    %
Monday, November 2, 2009
Libraries
    Libraries are just packages.
    The set of libraries is modest but growing.
    Some examples:
        Package            Purpose          Examples
            fmt     formatted I/O        Printf, Sprintf
             os      OS interface      Open, Read, Write
        strconv numbers <-> strings     Atoi, Atof, Itoa
             io      generic I/O            Copy, Pipe
           flag   flags: --help etc.       Bool, String
            log     event logging      Log, Logf, Stderr
         regexp  regular expressions      Compile, Match
       template       HTML, etc.          Parse, Execute
          bytes       byte arrays        Compare, Buffer

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

    Each produces the same result: "1 2 3.5n"

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

    Command:

          % godoc fmt
          % godoc fmt Printf




Monday, November 2, 2009
Exercise




Monday, November 2, 2009
Exercise: Day 1
                Set up a client.

                You all know what the Fibonacci series is.
                Write a package to implement it. There
                should be a function to get the next value.
                (You don't have structs yet, so use some
                globals to store state.) But instead of
                addition, make the operation settable by a
                function provided by the user. Integers?
                Floats? Strings? Up to you.

                Write a gotestable test for your package.


Monday, November 2, 2009
Next lesson


              Composite types

              Methods

              Interfaces




Monday, November 2, 2009
The
                                   Go
                           Programming Language

                                  Part 1

                                   Rob Pike
                                r@google.com
                                October 2009



Monday, November 2, 2009

Weitere ähnliche Inhalte

Was ist angesagt?

Erlang
ErlangErlang
ErlangESUG
 
Developing Korean Chatbot 101
Developing Korean Chatbot 101Developing Korean Chatbot 101
Developing Korean Chatbot 101Jaemin Cho
 
Model-Driven Software Development - Language Workbenches & Syntax Definition
Model-Driven Software Development - Language Workbenches & Syntax DefinitionModel-Driven Software Development - Language Workbenches & Syntax Definition
Model-Driven Software Development - Language Workbenches & Syntax DefinitionEelco Visser
 
NLP Deep Learning with Tensorflow
NLP Deep Learning with TensorflowNLP Deep Learning with Tensorflow
NLP Deep Learning with Tensorflowseungwoo kim
 
Before Starting Python Programming Language
Before Starting Python Programming LanguageBefore Starting Python Programming Language
Before Starting Python Programming LanguageKishan Tongrao
 
Why Erlang? - Bar Camp Atlanta 2008
Why Erlang?  - Bar Camp Atlanta 2008Why Erlang?  - Bar Camp Atlanta 2008
Why Erlang? - Bar Camp Atlanta 2008boorad
 
BERT Finetuning Webinar Presentation
BERT Finetuning Webinar PresentationBERT Finetuning Webinar Presentation
BERT Finetuning Webinar Presentationbhavesh_physics
 

Was ist angesagt? (10)

Python - Lesson 1
Python - Lesson 1Python - Lesson 1
Python - Lesson 1
 
Erlang
ErlangErlang
Erlang
 
Developing Korean Chatbot 101
Developing Korean Chatbot 101Developing Korean Chatbot 101
Developing Korean Chatbot 101
 
Latest trends in NLP - Exploring BERT
Latest trends in NLP -  Exploring BERTLatest trends in NLP -  Exploring BERT
Latest trends in NLP - Exploring BERT
 
Inside Python
Inside PythonInside Python
Inside Python
 
Model-Driven Software Development - Language Workbenches & Syntax Definition
Model-Driven Software Development - Language Workbenches & Syntax DefinitionModel-Driven Software Development - Language Workbenches & Syntax Definition
Model-Driven Software Development - Language Workbenches & Syntax Definition
 
NLP Deep Learning with Tensorflow
NLP Deep Learning with TensorflowNLP Deep Learning with Tensorflow
NLP Deep Learning with Tensorflow
 
Before Starting Python Programming Language
Before Starting Python Programming LanguageBefore Starting Python Programming Language
Before Starting Python Programming Language
 
Why Erlang? - Bar Camp Atlanta 2008
Why Erlang?  - Bar Camp Atlanta 2008Why Erlang?  - Bar Camp Atlanta 2008
Why Erlang? - Bar Camp Atlanta 2008
 
BERT Finetuning Webinar Presentation
BERT Finetuning Webinar PresentationBERT Finetuning Webinar Presentation
BERT Finetuning Webinar Presentation
 

Andere mochten auch

Andere mochten auch (20)

UDD: building polyglot anti-framework by Marek Piasecki
UDD: building polyglot anti-framework by Marek PiaseckiUDD: building polyglot anti-framework by Marek Piasecki
UDD: building polyglot anti-framework by Marek Piasecki
 
Dientes caricaturas
Dientes caricaturasDientes caricaturas
Dientes caricaturas
 
Qo s requirements networking application
Qo s requirements networking applicationQo s requirements networking application
Qo s requirements networking application
 
Power Services
Power ServicesPower Services
Power Services
 
Día Nacional de la Nutrición 2013
Día Nacional de la Nutrición 2013Día Nacional de la Nutrición 2013
Día Nacional de la Nutrición 2013
 
34 37 repor retribucion
34 37 repor retribucion34 37 repor retribucion
34 37 repor retribucion
 
3. tutorialguiabasico 2014
3.  tutorialguiabasico 20143.  tutorialguiabasico 2014
3. tutorialguiabasico 2014
 
Tab en 1
Tab en 1Tab en 1
Tab en 1
 
Futuro del email
Futuro del emailFuturo del email
Futuro del email
 
Innovacion
InnovacionInnovacion
Innovacion
 
Alum ve2013
Alum ve2013Alum ve2013
Alum ve2013
 
Literature Review(1)
Literature Review(1)Literature Review(1)
Literature Review(1)
 
Sifrol
SifrolSifrol
Sifrol
 
SenseByte MoviCRM
SenseByte MoviCRMSenseByte MoviCRM
SenseByte MoviCRM
 
FATCA 2014 Brochure
FATCA 2014 BrochureFATCA 2014 Brochure
FATCA 2014 Brochure
 
Alla vet allt om dig
Alla vet allt om digAlla vet allt om dig
Alla vet allt om dig
 
C:\Fakepath\Eval1 MªDel Mar Osorio
C:\Fakepath\Eval1 MªDel Mar OsorioC:\Fakepath\Eval1 MªDel Mar Osorio
C:\Fakepath\Eval1 MªDel Mar Osorio
 
Recorrido do río ebro
Recorrido do río ebroRecorrido do río ebro
Recorrido do río ebro
 
Normes d´us de la xarxa informatica
Normes d´us de la xarxa informaticaNormes d´us de la xarxa informatica
Normes d´us de la xarxa informatica
 
Ahmed Elnozahy CV
Ahmed Elnozahy  CVAhmed Elnozahy  CV
Ahmed Elnozahy CV
 

Ähnlich wie Go Course Day1

The reports of Perl's death have been greatly exaggerated
The reports of Perl's death have been greatly exaggeratedThe reports of Perl's death have been greatly exaggerated
The reports of Perl's death have been greatly exaggeratedDominique Dumont
 
Number of Computer Languages = 3
Number of Computer Languages = 3Number of Computer Languages = 3
Number of Computer Languages = 3Ram Sekhar
 
Evolution of programming languages
Evolution of programming languagesEvolution of programming languages
Evolution of programming languagesNitin Kumar Kashyap
 
Ruby is dying. What languages are cool now?
Ruby is dying. What languages are cool now?Ruby is dying. What languages are cool now?
Ruby is dying. What languages are cool now?Michał Konarski
 
Introduction To Computer Programming
Introduction To Computer ProgrammingIntroduction To Computer Programming
Introduction To Computer ProgrammingHussain Buksh
 
Python and Pytorch tutorial and walkthrough
Python and Pytorch tutorial and walkthroughPython and Pytorch tutorial and walkthrough
Python and Pytorch tutorial and walkthroughgabriellekuruvilla
 
Evolution of programming language
Evolution of programming languageEvolution of programming language
Evolution of programming languageSameer Saini
 
Welcome to the Symfony2 World - FOSDEM 2013
 Welcome to the Symfony2 World - FOSDEM 2013 Welcome to the Symfony2 World - FOSDEM 2013
Welcome to the Symfony2 World - FOSDEM 2013Lukas Smith
 
C language myths & secrets
C language myths & secretsC language myths & secrets
C language myths & secretsankush1510
 
Introduction to python
Introduction to pythonIntroduction to python
Introduction to pythonmckennadglyn
 
Clojure: an overview
Clojure: an overviewClojure: an overview
Clojure: an overviewLarry Diehl
 
Go language presentation
Go language presentationGo language presentation
Go language presentationparamisoft
 
all languages in computer programming
all languages in computer programmingall languages in computer programming
all languages in computer programminghamza239523
 
PYTHON FEATURES.pptx
PYTHON FEATURES.pptxPYTHON FEATURES.pptx
PYTHON FEATURES.pptxMaheShiva
 

Ähnlich wie Go Course Day1 (20)

Go courseday1
Go courseday1Go courseday1
Go courseday1
 
Go courseday1
Go courseday1Go courseday1
Go courseday1
 
The reports of Perl's death have been greatly exaggerated
The reports of Perl's death have been greatly exaggeratedThe reports of Perl's death have been greatly exaggerated
The reports of Perl's death have been greatly exaggerated
 
Number of Computer Languages = 3
Number of Computer Languages = 3Number of Computer Languages = 3
Number of Computer Languages = 3
 
Evolution of programming languages
Evolution of programming languagesEvolution of programming languages
Evolution of programming languages
 
Btree Nosql Oak
Btree Nosql OakBtree Nosql Oak
Btree Nosql Oak
 
Ruby is dying. What languages are cool now?
Ruby is dying. What languages are cool now?Ruby is dying. What languages are cool now?
Ruby is dying. What languages are cool now?
 
Introduction To Computer Programming
Introduction To Computer ProgrammingIntroduction To Computer Programming
Introduction To Computer Programming
 
Python and Pytorch tutorial and walkthrough
Python and Pytorch tutorial and walkthroughPython and Pytorch tutorial and walkthrough
Python and Pytorch tutorial and walkthrough
 
Evolution of programming language
Evolution of programming languageEvolution of programming language
Evolution of programming language
 
Welcome to the Symfony2 World - FOSDEM 2013
 Welcome to the Symfony2 World - FOSDEM 2013 Welcome to the Symfony2 World - FOSDEM 2013
Welcome to the Symfony2 World - FOSDEM 2013
 
C language myths & secrets
C language myths & secretsC language myths & secrets
C language myths & secrets
 
Python unit1
Python unit1Python unit1
Python unit1
 
Introduction to python
Introduction to pythonIntroduction to python
Introduction to python
 
Clojure: an overview
Clojure: an overviewClojure: an overview
Clojure: an overview
 
Go language presentation
Go language presentationGo language presentation
Go language presentation
 
all languages in computer programming
all languages in computer programmingall languages in computer programming
all languages in computer programming
 
Rustbridge
RustbridgeRustbridge
Rustbridge
 
Antlr Conexaojava
Antlr ConexaojavaAntlr Conexaojava
Antlr Conexaojava
 
PYTHON FEATURES.pptx
PYTHON FEATURES.pptxPYTHON FEATURES.pptx
PYTHON FEATURES.pptx
 

Kürzlich hochgeladen

UGC NET Paper 1 Mathematical Reasoning & Aptitude.pdf
UGC NET Paper 1 Mathematical Reasoning & Aptitude.pdfUGC NET Paper 1 Mathematical Reasoning & Aptitude.pdf
UGC NET Paper 1 Mathematical Reasoning & Aptitude.pdfNirmal Dwivedi
 
Python Notes for mca i year students osmania university.docx
Python Notes for mca i year students osmania university.docxPython Notes for mca i year students osmania university.docx
Python Notes for mca i year students osmania university.docxRamakrishna Reddy Bijjam
 
1029 - Danh muc Sach Giao Khoa 10 . pdf
1029 -  Danh muc Sach Giao Khoa 10 . pdf1029 -  Danh muc Sach Giao Khoa 10 . pdf
1029 - Danh muc Sach Giao Khoa 10 . pdfQucHHunhnh
 
Key note speaker Neum_Admir Softic_ENG.pdf
Key note speaker Neum_Admir Softic_ENG.pdfKey note speaker Neum_Admir Softic_ENG.pdf
Key note speaker Neum_Admir Softic_ENG.pdfAdmir Softic
 
The basics of sentences session 3pptx.pptx
The basics of sentences session 3pptx.pptxThe basics of sentences session 3pptx.pptx
The basics of sentences session 3pptx.pptxheathfieldcps1
 
SKILL OF INTRODUCING THE LESSON MICRO SKILLS.pptx
SKILL OF INTRODUCING THE LESSON MICRO SKILLS.pptxSKILL OF INTRODUCING THE LESSON MICRO SKILLS.pptx
SKILL OF INTRODUCING THE LESSON MICRO SKILLS.pptxAmanpreet Kaur
 
General Principles of Intellectual Property: Concepts of Intellectual Proper...
General Principles of Intellectual Property: Concepts of Intellectual  Proper...General Principles of Intellectual Property: Concepts of Intellectual  Proper...
General Principles of Intellectual Property: Concepts of Intellectual Proper...Poonam Aher Patil
 
ICT Role in 21st Century Education & its Challenges.pptx
ICT Role in 21st Century Education & its Challenges.pptxICT Role in 21st Century Education & its Challenges.pptx
ICT Role in 21st Century Education & its Challenges.pptxAreebaZafar22
 
This PowerPoint helps students to consider the concept of infinity.
This PowerPoint helps students to consider the concept of infinity.This PowerPoint helps students to consider the concept of infinity.
This PowerPoint helps students to consider the concept of infinity.christianmathematics
 
Understanding Accommodations and Modifications
Understanding  Accommodations and ModificationsUnderstanding  Accommodations and Modifications
Understanding Accommodations and ModificationsMJDuyan
 
ICT role in 21st century education and it's challenges.
ICT role in 21st century education and it's challenges.ICT role in 21st century education and it's challenges.
ICT role in 21st century education and it's challenges.MaryamAhmad92
 
Micro-Scholarship, What it is, How can it help me.pdf
Micro-Scholarship, What it is, How can it help me.pdfMicro-Scholarship, What it is, How can it help me.pdf
Micro-Scholarship, What it is, How can it help me.pdfPoh-Sun Goh
 
Magic bus Group work1and 2 (Team 3).pptx
Magic bus Group work1and 2 (Team 3).pptxMagic bus Group work1and 2 (Team 3).pptx
Magic bus Group work1and 2 (Team 3).pptxdhanalakshmis0310
 
Making communications land - Are they received and understood as intended? we...
Making communications land - Are they received and understood as intended? we...Making communications land - Are they received and understood as intended? we...
Making communications land - Are they received and understood as intended? we...Association for Project Management
 
SOC 101 Demonstration of Learning Presentation
SOC 101 Demonstration of Learning PresentationSOC 101 Demonstration of Learning Presentation
SOC 101 Demonstration of Learning Presentationcamerronhm
 
Holdier Curriculum Vitae (April 2024).pdf
Holdier Curriculum Vitae (April 2024).pdfHoldier Curriculum Vitae (April 2024).pdf
Holdier Curriculum Vitae (April 2024).pdfagholdier
 
ComPTIA Overview | Comptia Security+ Book SY0-701
ComPTIA Overview | Comptia Security+ Book SY0-701ComPTIA Overview | Comptia Security+ Book SY0-701
ComPTIA Overview | Comptia Security+ Book SY0-701bronxfugly43
 
2024-NATIONAL-LEARNING-CAMP-AND-OTHER.pptx
2024-NATIONAL-LEARNING-CAMP-AND-OTHER.pptx2024-NATIONAL-LEARNING-CAMP-AND-OTHER.pptx
2024-NATIONAL-LEARNING-CAMP-AND-OTHER.pptxMaritesTamaniVerdade
 
Third Battle of Panipat detailed notes.pptx
Third Battle of Panipat detailed notes.pptxThird Battle of Panipat detailed notes.pptx
Third Battle of Panipat detailed notes.pptxAmita Gupta
 
Accessible Digital Futures project (20/03/2024)
Accessible Digital Futures project (20/03/2024)Accessible Digital Futures project (20/03/2024)
Accessible Digital Futures project (20/03/2024)Jisc
 

Kürzlich hochgeladen (20)

UGC NET Paper 1 Mathematical Reasoning & Aptitude.pdf
UGC NET Paper 1 Mathematical Reasoning & Aptitude.pdfUGC NET Paper 1 Mathematical Reasoning & Aptitude.pdf
UGC NET Paper 1 Mathematical Reasoning & Aptitude.pdf
 
Python Notes for mca i year students osmania university.docx
Python Notes for mca i year students osmania university.docxPython Notes for mca i year students osmania university.docx
Python Notes for mca i year students osmania university.docx
 
1029 - Danh muc Sach Giao Khoa 10 . pdf
1029 -  Danh muc Sach Giao Khoa 10 . pdf1029 -  Danh muc Sach Giao Khoa 10 . pdf
1029 - Danh muc Sach Giao Khoa 10 . pdf
 
Key note speaker Neum_Admir Softic_ENG.pdf
Key note speaker Neum_Admir Softic_ENG.pdfKey note speaker Neum_Admir Softic_ENG.pdf
Key note speaker Neum_Admir Softic_ENG.pdf
 
The basics of sentences session 3pptx.pptx
The basics of sentences session 3pptx.pptxThe basics of sentences session 3pptx.pptx
The basics of sentences session 3pptx.pptx
 
SKILL OF INTRODUCING THE LESSON MICRO SKILLS.pptx
SKILL OF INTRODUCING THE LESSON MICRO SKILLS.pptxSKILL OF INTRODUCING THE LESSON MICRO SKILLS.pptx
SKILL OF INTRODUCING THE LESSON MICRO SKILLS.pptx
 
General Principles of Intellectual Property: Concepts of Intellectual Proper...
General Principles of Intellectual Property: Concepts of Intellectual  Proper...General Principles of Intellectual Property: Concepts of Intellectual  Proper...
General Principles of Intellectual Property: Concepts of Intellectual Proper...
 
ICT Role in 21st Century Education & its Challenges.pptx
ICT Role in 21st Century Education & its Challenges.pptxICT Role in 21st Century Education & its Challenges.pptx
ICT Role in 21st Century Education & its Challenges.pptx
 
This PowerPoint helps students to consider the concept of infinity.
This PowerPoint helps students to consider the concept of infinity.This PowerPoint helps students to consider the concept of infinity.
This PowerPoint helps students to consider the concept of infinity.
 
Understanding Accommodations and Modifications
Understanding  Accommodations and ModificationsUnderstanding  Accommodations and Modifications
Understanding Accommodations and Modifications
 
ICT role in 21st century education and it's challenges.
ICT role in 21st century education and it's challenges.ICT role in 21st century education and it's challenges.
ICT role in 21st century education and it's challenges.
 
Micro-Scholarship, What it is, How can it help me.pdf
Micro-Scholarship, What it is, How can it help me.pdfMicro-Scholarship, What it is, How can it help me.pdf
Micro-Scholarship, What it is, How can it help me.pdf
 
Magic bus Group work1and 2 (Team 3).pptx
Magic bus Group work1and 2 (Team 3).pptxMagic bus Group work1and 2 (Team 3).pptx
Magic bus Group work1and 2 (Team 3).pptx
 
Making communications land - Are they received and understood as intended? we...
Making communications land - Are they received and understood as intended? we...Making communications land - Are they received and understood as intended? we...
Making communications land - Are they received and understood as intended? we...
 
SOC 101 Demonstration of Learning Presentation
SOC 101 Demonstration of Learning PresentationSOC 101 Demonstration of Learning Presentation
SOC 101 Demonstration of Learning Presentation
 
Holdier Curriculum Vitae (April 2024).pdf
Holdier Curriculum Vitae (April 2024).pdfHoldier Curriculum Vitae (April 2024).pdf
Holdier Curriculum Vitae (April 2024).pdf
 
ComPTIA Overview | Comptia Security+ Book SY0-701
ComPTIA Overview | Comptia Security+ Book SY0-701ComPTIA Overview | Comptia Security+ Book SY0-701
ComPTIA Overview | Comptia Security+ Book SY0-701
 
2024-NATIONAL-LEARNING-CAMP-AND-OTHER.pptx
2024-NATIONAL-LEARNING-CAMP-AND-OTHER.pptx2024-NATIONAL-LEARNING-CAMP-AND-OTHER.pptx
2024-NATIONAL-LEARNING-CAMP-AND-OTHER.pptx
 
Third Battle of Panipat detailed notes.pptx
Third Battle of Panipat detailed notes.pptxThird Battle of Panipat detailed notes.pptx
Third Battle of Panipat detailed notes.pptx
 
Accessible Digital Futures project (20/03/2024)
Accessible Digital Futures project (20/03/2024)Accessible Digital Futures project (20/03/2024)
Accessible Digital Futures project (20/03/2024)
 

Go Course Day1

  • 1. The Go Programming Language Part 1 Rob Pike r@google.com October, 2009 Monday, November 2, 2009
  • 2. The team Russ Cox Robert Griesemer Ian Lance Taylor Rob Pike Ken Thompson Plus lots of contributors... contact: nuts@golang.org: user discussion dev@golang.org: developers Monday, November 2, 2009
  • 3. 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
  • 4. Today’s Outline Motivation Basics the easy, mostly familiar stuff Packages and program construction Monday, November 2, 2009
  • 6. Why, briefly? In the current world, languages don't help enough: Computers fast but software construction slow Dependency analysis necessary for speed, safety Types get in the way too much Garbage collection, concurrency poorly supported Multi-core seen as crisis not opportunity Monday, November 2, 2009
  • 7. Go New Experimental Concurrent Garbage-collected Systems Language Monday, November 2, 2009
  • 8. In short Our goal is to make programming fun again. - the feel of a dynamic language with the safety of a static type system - compile to machine language so it runs fast - real run-time that supports GC, concurrency - lightweight, flexible type system - has methods but not a conventional OO language Monday, November 2, 2009
  • 9. Resources For more background, etc. see the documentation: http://golang.org/ Includes: - reference manual - tutorial - library documentation - setup and how-to docs - FAQs - more Monday, November 2, 2009
  • 10. 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, x86-64); support for 32-bit x86 exists; ARM underway. Garbage collector, concurrency etc. implemented. Rudimentary libraries improving fast. Monday, November 2, 2009
  • 12. Time for some code package main import "fmt" func main() { fmt.Print("Hello, n") } Monday, November 2, 2009
  • 13. Language basics Assuming familiarity with other C-like languages, here comes a quick tour of the basics. This will be mostly easy, familiar and therefore dull. Apologies for that. The next two lectures contain the fun stuff but we need to lay down the groundwork first. Monday, November 2, 2009
  • 14. Lexical structure Mostly traditional with modern details. Source is UTF-8. White space: blank, tab, newline. Identifiers are alphanumeric (plus ‘_’) with “alpha” and “numeric” defined by Unicode. Comments: /* This is a comment; no nesting */ // So is this. Monday, November 2, 2009
  • 15. Literals C-like but numbers require no signedness or size markings (more about this soon) 23 0x0FF 1.234e7 C-like strings, but Unicode/UTF-8. Also xNN always 2 digits; 012 always 3; both are bytes. "Hello, worldn" "xFF" // 1 byte "u00FF" // 1 unicode char, 2 bytes of UTF-8 Raw strings `n.abct` == "n.abct" Monday, November 2, 2009
  • 16. Syntax overview Basically C-like with reversed types and declarations, plus keywords to introduce each type of declaration. var a int var b, c *int // note difference from C var d []int type S struct { a, b int } Basic control structures are familiar: if a == b { return true } else { return false } for i = 0; i < 10; i++ { ... } Note: no parentheses, but braces required. More about all this later. Monday, November 2, 2009
  • 17. Semicolons Semicolons separate (not terminate) statements but: - semis never required at top (global) level - semis not required after closing ) of declaration list - 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.Printf("%dn", i) } However, implicit empty statement allows you to use semicolons the same way as in C if you want. Monday, November 2, 2009
  • 18. Numeric types Numeric types are built in, will be familiar: int uint float int8 uint8 = byte int16 uint16 int32 uint32 float32 int64 uint64 float64 Also uintptr, an integer big enough to store a pointer. These are all distinct types; int is not int32 even on a 32-bit machine. No implicit conversions (but don't panic). Monday, November 2, 2009
  • 19. Bool The usual boolean type, bool, with values true and false (predefined constants). The if statement etc. use boolean expressions. Pointers and integers are not booleans.† † Consider (not Go): const bool False = "false" Monday, November 2, 2009
  • 20. String The built-in type string represents immutable arrays of bytes - that is, text. Strings are length-delimited not NUL-terminated. String literals have type string. Immutable, just like ints. Can reassign variables but not edit values. Just as 3 is always 3, "hello" is always "hello". Language has good support for string manipulation. Monday, November 2, 2009
  • 21. Expressions Mostly C-like operators. Binary operators: Prec. operators comments 6 * / % << >> & &^ &^ is "bit clear" 5 + - | ^ ^ is "xor" 4 == != < <= > >= 3 <- communication 2 && 1 || Operators that are also unary: & ! * + - ^ <- Unary ^ is complement. Monday, November 2, 2009
  • 22. Go vs. C expressions Surprises for the C programmer: fewer precedence levels (should be easy) ^ instead of ~ (it's binary "exclusive or" made unary) ++ and -- are not expression operators (x++ is a statement, not an expression; *p++ is (*p)++ not *(p++)) &^ is new; handy in constant expressions << >> etc. require an unsigned shift count Non-surprises: assignment ops work as expected: += <<= &^= etc. expressions generally look the same (indexing, function call, etc.) Monday, November 2, 2009
  • 23. 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.Printf("%5.2gn", 2*math.Sin(PI/8)) "hello" ", " "there" // lexical cat "hello, " + str // dynamic cat Monday, November 2, 2009
  • 24. Numeric conversions Converting a numeric value from one type to another is a conversion, 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) // == "u1234" string(array_of_bytes) // bytes -> bytes string(array_of_ints) // ints -> Unicode/UTF-8 Monday, November 2, 2009
  • 25. Constants Numeric constants are "ideal numbers": no size or sign, hence no l or u or ul endings. 077 // octal 0xFEEDBEEEEEEEEEEEEEEEEEEEEF // hexadecimal 1 << 100 There are integer and floating-point ideal numbers; syntax of literal determines type: 1.234e5 1e2 // floating-point 100 // integer Monday, November 2, 2009
  • 26. Constant Expressions Floating point and integer constants can be combined at will, with the type of the resulting expression determined by the type of the constants. The operations themselves also depend on the type. 2*3.14 // floating point: 6.28 3./2 // floating point: 1.5 3/2 // integer: 1 // high precision: const Ln2 0.693147180559945309417232121458 = 176568075500134360255254120680009 const Log2E 1/Ln2 // accurate reciprocal = Representation is "big enough" (1024 bits now). Monday, November 2, 2009
  • 27. Consequences of ideal numbers The language permits the use of constants without explicit conversion if the value can be represented (there's no conversion necessary; the value is OK): var million int = 1e6 // float constant math.Sin(1) Constants must be representable in their type. Example: ^0 is -1 which is not in range 0-255. uint8(^0) // bad: -1 can't be represented ^uint8(0) // OK uint8(350) // bad: 350 can't be represented uint8(35.0) // OK: 35 uint8(3.5) // bad: 3.5 can't be represented Monday, November 2, 2009
  • 28. Declarations Declarations are introduced by a keyword (var, const, type, func) and look reversed compared to C: var i int const PI = 22./7. type Point struct { x, y int } func sum(a, b int) int { return a + b } Why are they reversed? Earlier example: var p, q *int Also functions read better and are consistent with other declarations. And there's another reason, coming up. Monday, November 2, 2009
  • 29. Var Variable declarations are introduced by var. They may have a type or an initialization expression; one or both must be present. Initializers must match variables (and types!). var i int var j = 365.245 var k int = 0 var l, m uint64 = 1, 2 var billion int64 = 1e9 // float constant! var inter, floater, stringer = 1, 2.0, "hi" Monday, November 2, 2009
  • 30. Distributing var Annoying to type var all the time. Group with parens! Need semicolons as separators. var ( i int; j = 356.245; k int = 0; l, m uint64 = 1, 2; billion int64 = 1e9; inter, floater, stringer = 1, 2.0, "hi" ) Applies to const, type, var Monday, November 2, 2009
  • 31. The := "short declaration" Within functions (only), declarations of the form var v = value can be shortened to v := value (Another reason for the name/type reversal.) The type is that of the value (for ideal numbers, get int or float, accordingly.) a, b, c, d := 1, 2.0, "three", FOUR These are used a lot and are available in places such as for loop initializers. Monday, November 2, 2009
  • 32. Const Constant declarations are introduced by const. They must have a "constant expression", evaluated at compile time, as initializer and may have an optional type specifier. const Pi = 22./7. const AccuratePi float64 = 355./113 const beef, two, parsnip = "meat", 2, "veg" const ( Monday, Tuesday, Wednesday = 1, 2, 3; Thursday, Friday, Saturday = 4, 5, 6; ) Monday, November 2, 2009
  • 33. Iota Constant declarations can use the counter iota, which starts at 0 in each const block and increments at each semicolon. const ( Monday = iota; // 0 Tuesday = iota; // 1 ) Shorthand: Previous type and expressions repeat. const ( loc0, bit0 uint32 = iota, 1<<iota; // 0, 1 loc1, bit1; // 1, 2 loc2, bit2; // 2, 4 ) Monday, November 2, 2009
  • 34. 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
  • 35. 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
  • 36. 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
  • 37. Control structures Similar to C, but different in significant ways. Go has if, for and switch (plus one more to appear later). As stated before, no parentheses, but braces mandatory. They are quite regular when seen as a set. For instance, if, for and switch all accept initialization statements. Monday, November 2, 2009
  • 38. Forms of control structures Details follow but in general: if and switch come in 1- and 2-element forms, described below. for has 1- and 3-element forms: single is C's while: for a {} triple is C's for: for a;b;c {} In any of these forms, any element can be empty. Monday, November 2, 2009
  • 39. If Basic form is familiar, but no dangling else problem: if x < 5 { less() } if x < 5 { less() } else if x == 5 { equal() } Initialization statement allowed; requires semicolon. if v := f(); v < 10 { fmt.Printf("%d less than 10n", v) } else { fmt.Printf("%d not less than 10", v) } Useful with multivariate functions: if n, err = fd.Write(buf); err != nil { ... } Missing condition means true, which is not too useful in this context but handy in for, switch. Monday, November 2, 2009
  • 40. For Basic form is familiar: for i := 0; i < 10; i++ { ... } Missing condition means true: for ;; { fmt.Printf("looping forever") } But you can leave out the semis too: for { fmt.Printf("Mine! ") } Don't forget multivariate assigments: for i,j := 0,N; i < j; i,j = i+1,j-1 {...} (There's no comma operator as in C.) Monday, November 2, 2009
  • 41. Switch details Switches are superficially similar to C's. But there are important differences: - expressions need not be constants or even ints. - no automatic fall through - instead, lexically last statement can be fallthrough - multiple cases can be comma-separated switch count%7 { case 4,5,6: error(); case 3: a *= v; fallthrough; case 2: a *= v; fallthrough; case 1: a *= v; fallthrough; case 0: return a*v; } Monday, November 2, 2009
  • 42. Switch Switch is more powerful than in C. Familiar form: switch a { case 0: fmt.Printf("0") default: fmt.Printf("non-zero") } The expressions can be any type and a missing switch expression means true. Result: if-else chain: a, b := x[i], y[j]; switch { case a < b: return -1 case a == b: return 0 case a > b: return 1 } or switch a, b := x[i], y[j]; { ... } Monday, November 2, 2009
  • 43. Break, continue, etc. The break and continue statements work as in C. They may specify a label to affect an outer structure: Loop: for i := 0; i < 10; i++ { switch f(i) { case 0, 1, 2: break Loop } g(i) } Yes Ken, there is a goto. Monday, November 2, 2009
  • 44. Functions Functions are introduced by the func keyword. Return type, if any, comes after parameters. The return does as you expect. func square(f float) float { return f*f } A function can return multiple values. If so, the return types are a parenthesized list. func MySqrt(f float) (float, bool) { if f >= 0 { return math.Sqrt(f), true } return 0, false } Monday, November 2, 2009
  • 45. Functions with result variables The result "parameters" are actual variables you can use if you name them. func MySqrt(f float) (v float, ok bool) { if f >= 0 { v,ok = math.Sqrt(f),true } else { v,ok = 0,false } return v,ok } The result variables are initialized to "zero" (0, 0.0, false etc. according to type; more in a sec). func MySqrt(f float) (v float, ok bool) { if f >= 0 { v,ok = math.Sqrt(f),true } return v,ok } Monday, November 2, 2009
  • 46. The empty return Finally, a return with no expressions returns the existing value of the result variables. Two more versions of MySqrt: func MySqrt(f float) (v float, ok bool) { if f >= 0 { v,ok = math.Sqrt(f),true } return // must be explicit } func MySqrt(f float) (v float, ok bool) { if f < 0 { return } // error case return math.Sqrt(f),true } Monday, November 2, 2009
  • 47. What was that about zero? All memory in Go is initialized. All variables are initialized upon execution of their declaration. Without an initializing expression, the "zero value" of the type is used. The loop for i := 0; i < 5; i++ { var v int; fmt.Printf("%dn", v); v = 5 } will print 0, 0, 0, 0, 0. The zero value depends on the type: integer 0, floating point 0.0, false, empty string, nil pointer, zeroed struct, etc. Monday, November 2, 2009
  • 48. Defer The defer statement executes a function (or method) when the enclosing function returns. The arguments are evaluated at the point of the defer; the function call happens upon return. func data(name string) string { f := os.Open(name, os.O_RDONLY, 0); defer f.Close(); contents := io.ReadAll(f); return contents; } Useful for closing fds, unlocking mutexes, etc. Monday, November 2, 2009
  • 49. One function invocation per defer Each defer that executes queues a function call to execute, in LIFO order, so func f() { for i := 0; i < 5; i++ { defer fmt.Printf("%d ", i) } } prints 4 3 2 1 0. You can close all those FDs or unlock those mutexes at the end. Monday, November 2, 2009
  • 50. Tracing with defer func trace(s string) { Print("entering:", s); } func untrace(s string) { Print("leaving:", s); } func a() { trace("a"); defer untrace("a"); Print("in a") } func b() { trace("b"); defer untrace("b"); Print("in b"); a() } func main() { b() } But we can do it more neatly... Monday, November 2, 2009
  • 51. Args evaluate now, defer later func trace(s string) string { Print("entering:", s); return s } func un(s string) { Print("leaving:", s) } func a() { defer un(trace("a")); Print("in a") } func b() { defer un(trace("b")); Print("in b"); a() } func main() { b() } Monday, November 2, 2009
  • 52. Function literals As in C, functions can't be declared inside functions - but function literals can be assigned to variables. func f() { for i := 0; i < 10; i++ { g := func(i int) { fmt.Printf("%d",i) }; g(i); } } Monday, November 2, 2009
  • 53. Function literals are closures Function literals are indeed closures. func adder() (func(int) int) { var x int; return func(delta int) int { x += delta; return x } } var f = adder(); fmt.Print(f(1)); fmt.Print(f(20)); fmt.Print(f(300)); Prints 1 21 321 - accumulating in f's x Monday, November 2, 2009
  • 55. Packages A program is constructed as a "package", which may use facilities from other packages. A Go program is created by linking together a set of packages. A package may be built from multiple source files. Names in imported packages are accessed through a "qualified identifier": packagename.Itemname. Monday, November 2, 2009
  • 56. Source file structure Every source file contains: - a package clause (which package it's in); that name is the default name used by importers. package fmt - an optional set of import declarations import "fmt" // use default name import my_fmt "fmt" // use the name my_fmt - zero or more global or "package-level" declarations. Monday, November 2, 2009
  • 57. A single-file package package main // this file is part of package "main" import "fmt" // this file uses package "fmt" const hello = "Hello, n" func main() { fmt.Print(hello) // fmt is imported pkg name } Monday, November 2, 2009
  • 58. main and main.main() Each Go program contains one package called main and its main function, after initialization, is where execution starts, analogous with the global main() in C, C++. The main.main function takes no arguments and returns no value. The program exits - immediately and successfully - when main.main returns. Monday, November 2, 2009
  • 59. Os Package os provides Exit() and access to file I/O, command-line arguments, etc. (Flag package appears shortly.) // A version of echo(1) package main import ("fmt"; "os") func main() { if len(os.Args) < 2 { // length of array os.Exit(1) } for i := 1; i < len(os.Args); i++ { fmt.Printf("arg %d: %sn", i, os.Args[i]) } } // falling off end == os.Exit(0) Monday, November 2, 2009
  • 60. Global and package scope Within a package, all global variables, functions, types, and constants are visible from all the package's source files. For clients (importers) of the package, names must be upper case to be visible: global variables, functions, types, constants, plus methods and structure fields for global variables and types. const hello = "you smell" // package visible const Hello = "you smell nice" // globally visible const _Bye = "stinko!" // _ is not upper Very different from C/C++: no extern, static, private, public. Monday, November 2, 2009
  • 61. Initialization Two ways to initialize global variables before execution of main.main: 1) A global declaration with an initializer 2) An init() function, as many as one per source file. Package dependency guarantees correct execution order. Initialization is always single-threaded. Monday, November 2, 2009
  • 62. Initialization example package transcendental import "math" var Pi float64 func init() { Pi = 4*math.Atan(1) // init() function computes Pi } ==== package main import ( "fmt"; "transcendental" ) var twoPi = 2*transcendental.Pi // decl computes twoPi func main() { fmt.Printf("2*Pi = %gn", twoPi); } ==== Output: 2*Pi = 6.283185307179586 Monday, November 2, 2009
  • 63. Package and program construction To build a program, the packages, and the files within them, must be compiled in the correct order. Package dependencies determine the order in which to build packages. Within a package, the source files must (conceptually at least) all be compiled together. The package is compiled as a unit, and conventionally each directory contains one package. Ignoring tests, cd my_package 6g *.go Usually we use make. Monday, November 2, 2009
  • 64. Building the fmt package % pwd /Users/r/go/src/pkg/fmt % ls Makefile fmt_test.go format.go print.go % make # hand-written but trivial % ls Makefile _go_.6 _obj fmt_test.go format.go print.go % make clean; make ... Objects go into the subdirectory _obj. Makefiles are written using helpers called Make.pkg etc.; see sources Monday, November 2, 2009
  • 65. Testing To test a package, write a set of Go source files within the same package; give the files names of the form *_test.go. Within those files, global functions with names starting Test[^a-z]* will be run by the testing tool, gotest. Those functions should have signature func TestXxxx(t *testing.T) The "testing" package provides support for logging, error reporting. Monday, November 2, 2009
  • 66. An example test % grep "interesting_bits" fmt_test.go package fmt // package is fmt, not main import ( "testing" ) func TestFlagParser(t *testing.T) { var flagprinter flagPrinter; for i := 0; i < len(flagtests); i++ { tt := flagtests[i]; s := Sprintf(tt.in, &flagprinter); if s != tt.out { // method call coming up - easy to understand. t.Errorf("Sprintf(%q, &flagprinter) => %q," " want %q", tt.in, s, tt.out) } } } % Monday, November 2, 2009
  • 67. Testing: gotest % ls Makefile fmt.a fmt_test.go format.go print.go % gotest # by default, does all *_test.go PASS wally=% gotest fmt_test.go --chatty === RUN fmt.TestFlagParser --- PASS: fmt.TestFlagParser === RUN fmt.TestArrayPrinter --- PASS: fmt.TestArrayPrinter === RUN fmt.TestFmtInterface --- PASS: fmt.TestFmtInterface === RUN fmt.TestStructPrinter --- PASS: fmt.TestStructPrinter === RUN fmt.TestSprintf --- PASS: fmt.TestSprintf PASS % Monday, November 2, 2009
  • 68. Libraries Libraries are just packages. The set of libraries is modest but growing. Some examples: Package Purpose Examples fmt formatted I/O Printf, Sprintf os OS interface Open, Read, Write strconv numbers <-> strings Atoi, Atof, Itoa io generic I/O Copy, Pipe flag flags: --help etc. Bool, String log event logging Log, Logf, Stderr regexp regular expressions Compile, Match template HTML, etc. Parse, Execute bytes byte arrays Compare, Buffer Monday, November 2, 2009
  • 69. A little more about fmt The fmt package contains familiar names in initial caps: Printf - print to standard output Sprintf - returns a string Fprintf - operates on os.Stderr etc. (tomorrow) but also Print, Sprint, Fprint - no format Println, Sprintln, Fprintln - no format, adds spaces, final n fmt.Printf("%d %d %gn", 1, 2, 3.5) fmt.Print(1, " ", 2, " ", 3.5, "n") fmt.Println(1, 2, 3.5) Each produces the same result: "1 2 3.5n" Monday, November 2, 2009
  • 70. Library documentation Source code contains comments. Command line or web tool pulls them out. Link: http://golang.org/pkg/ Command: % godoc fmt % godoc fmt Printf Monday, November 2, 2009
  • 72. Exercise: Day 1 Set up a client. You all know what the Fibonacci series is. Write a package to implement it. There should be a function to get the next value. (You don't have structs yet, so use some globals to store state.) But instead of addition, make the operation settable by a function provided by the user. Integers? Floats? Strings? Up to you. Write a gotestable test for your package. Monday, November 2, 2009
  • 73. Next lesson Composite types Methods Interfaces Monday, November 2, 2009
  • 74. The Go Programming Language Part 1 Rob Pike r@google.com October 2009 Monday, November 2, 2009