Learning Go - Gieben (2011).pdf

(1438 KB) Pobierz
727162727 UNPDF
Learning Go
Authors:
Miek Gieben
Thanks to:
Go Authors
Google
Go Nuts mailing list
This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License .
Miek Gieben – ©2010, 2011
727162727.003.png
This work is licensed under the Attribution-NonCommercial-ShareAlike 3.0 Unported
License. To view a copy of this license, visit
Commons, 171 Second Street, Suite 300, San Francisco, California, 94105, USA.
All example code used in this book, are hereby put in the public domain.
Learning as we Go ( 0.5 )
Updated to Go release weekly/weekly.2011-08-10
 
Contents
1 Introduction 1
Official documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Getting Go . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
Origins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Answers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 Basics 6
Hello World . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Compiling and running code . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Variables, types and keywords . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Operators and built-in functions . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Go keywords . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Control structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Built-in functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Arrays, slices and maps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Answers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3 Functions 30
Scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Multiple return values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
Named result parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Deferred code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Variadic parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Functions as values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Panic and recovering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Answers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4 Packages 48
Building a package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Identifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Documenting packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
Testing packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Useful packages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Answers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5 Beyond the basics 60
Allocation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Defining your own types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Conversions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Answers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
727162727.004.png
ii Chapter: Contents
6 Interfaces 72
Methods . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Interface names . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
A sorting example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Answers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
7 Concurrency 84
More on channels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Answers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
8 Communication 92
Files and directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Command line arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
Executing commands . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Networking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Exercises . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Answers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
A Colophon 106
Contributors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
License and copyright . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
B Index
108
C Bibliography
110
List of Figures
1.1 Chronology of Go . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.1 Array versus slice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
3.1 A simple LIFO stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
6.1 Peeling away the layers using reflection . . . . . . . . . . . . . . . . . . . . . 79
List of Code Examples
2.1 Hello world . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 Makefile for a program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3 Declaration with = . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.4 Declaration with := . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.5 Familiar types are still distinct . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.6 Arrays and slices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.7 Simple for loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.8 For loop with an array . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
2.9 Fizz-Buzz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
727162727.005.png
List of Code Examples iii
2.10 Strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.11 Runes in strings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
2.12 Reverse a string . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
3.1 A function declaration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.2 Recursive function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.3 Local scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.4 Global scope . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.5 Scope when calling functions from functions . . . . . . . . . . . . . . . . . . . 32
3.6 Without defer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.7 With defer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.8 Function literal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.9 Function literal with parameters . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.10 Access return values within defer . . . . . . . . . . . . . . . . . . . . . . . . 36
3.11 Anonymous function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.12 Functions as values in maps . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3.13 Average function in Go . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
3.14 stack.String() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
3.15 A function with variable number of arguments . . . . . . . . . . . . . . . . . 43
3.16 Fibonacci function in Go . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.17 A Map function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
3.18 Bubble sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
4.1 A small package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.2 Use of the even package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
4.3 Makefile for a package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
4.4 Test file for even package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
4.5 Stack in a package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.6 Push/Pop test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.7 Package Makefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
4.8 A (rpn) calculator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
5.1 Use of a pointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.2 Dereferencing a pointer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
5.3 Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
5.4 A generic map function in Go . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.5 A cat program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70
6.1 Defining a struct and methods on it . . . . . . . . . . . . . . . . . . . . . . . 72
6.2 A function with an empty interface argument . . . . . . . . . . . . . . . . . . 74
6.3 Failing to implement an interface . . . . . . . . . . . . . . . . . . . . . . . . 74
6.4 Failure extending built-in types . . . . . . . . . . . . . . . . . . . . . . . . . . 75
6.5 Failure extending non-local types . . . . . . . . . . . . . . . . . . . . . . . . . 75
6.6 Introspection using reflection . . . . . . . . . . . . . . . . . . . . . . . . . . 78
6.7 Reflection and the type and value . . . . . . . . . . . . . . . . . . . . . . . . 79
6.8 Reflect with private member . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
6.9 Reflect with public member . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
6.10 Generic way of calculating a maximum . . . . . . . . . . . . . . . . . . . . . 81
7.1 Go routines in action . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
7.2 Go routines and a channel . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
7.3 Using select . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
7.4 Channels in Go . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
7.5 Adding an extra quit channel . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
7.6 A Fibonacci function in Go . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
727162727.001.png 727162727.002.png
Zgłoś jeśli naruszono regulamin