3. go runコマンドで実行してみましょう。
ソースの実行
~$ go run learngo01.go
Hello world!
以降、learngo01.goにコードの差分を繰り返し「記述して実行」して行きますので、差分を残
したい場合は、ファイルをコピーした後、コピーしたファイルに追記して行って下さい。
ファイルのコピー
~$ cp learngo01.go learngo02.go
~$ ls
learngo01.go learngo02.go
以降、便宜上、追加していく差分の内容を「learngo連番.go」で表示してあります。
また、資料の性質上、資料のソースをそのまま「記述して実行」するとエラーになりますの
で、その際は、
● 各関数の呼び出しがコメントアウトされているので有効にする。
● import句のパッケージ定義がコメントアウトされているので有効にする。
などを行って下さい。
「複数の引数や戻り値」
learngo02.go
func beyondHello() {
var x int
x = 3
y := 4
sum, prod := learnMultiple(x, y)
fmt.Println("sum:", sum, "prod:", prod)
// learnTypes()
}
func learnMultiple(x, y int) (sum, prod int) {
return x + y, x * y
}
「様々な型」
4. learngo03.go
func learnTypes() {
s := "Learn Go!"
s2 := `A "raw" string literal
can include line breaks.`
g := 'Σ'
f := 3.14195
c := 3 + 4i
var u uint = 7
var pi float32 = 22. / 7
n := byte('n')
var a4 [4]int
a3 := [...]int{3, 1, 5}
s3 := []int{4, 5, 9}
s4 := make([]int, 4)
var d2 [][]float64
bs := []byte("a slice")
// p, q := learnMemory()
// fmt.Println(*p, *q)
m := map[string]int{"three": 3, "four": 4}
m["one"] = 1
_, _, _, _, _, _, _, _, _ = s2, g, f, u, pi, n, a3, s4, bs
fmt.Println(s, c, a4, s3, d2, m)
// learnFlowControl()
}
「メモリー割り当て」
learngo04.go
func learnMemory() (p, q *int) {
p = new(int)
s := make([]int, 20)
s[3] = 7
r := -2
return &s[3], &r
}
5. 「フロー制御」
learngo05.go
func expensiveComputation() float64 {
return m.Exp(10)
}
func learnFlowControl() {
if true {
fmt.Println("told ya")
}
if false {
// Pout.
} else {
// Gloat.
}
x := 42.0
switch x {
case 0:
case 1:
case 42:
case 43:
}
for x := 0; x < 3; x++ {
fmt.Println("iteration", x)
}
for {
break
continue
}
if y := expensiveComputation(); y > x {
x = y
}
xBig := func() bool {
return x > 10000
}
fmt.Println("xBig:", xBig())
x = 1.3e3
fmt.Println("xBig:", xBig())
goto love
love:
6. // learnDefer()
// learnInterfaces()
}
「遅延実行」
learngo06.go
func learnDefer() (ok bool) {
defer fmt.Println("deferred statements execute in reverse (LIFO) order.")
defer fmt.Println("nThis line is being printed first because")
return true
}
「インターフェース」と「構造体」
learngo07.go
type Stringer interface {
String() string
}
type pair struct {
x, y int
}
func (p pair) String() string {
return fmt.Sprintf("(%d, %d)", p.x, p.y)
}
func learnInterfaces() {
p := pair{3, 4}
fmt.Println(p.String())
var i Stringer
i = p
fmt.Println(i.String())
fmt.Println(p)
fmt.Println(i)
// learnVariadicParams("great", "learning", "here!")
}
「可変引数」
7. learngo08.go
func learnVariadicParams(myStrings ...interface{}) {
for _, param := range myStrings {
fmt.Println("param:", param)
}
fmt.Println("params:", fmt.Sprintln(myStrings...))
// learnErrorHandling()
}
「エラーハンドリング」
learngo09.go
func learnErrorHandling() {
m := map[int]string{3: "three", 4: "four"}
if x, ok := m[1]; !ok {
fmt.Println("no one there")
} else {
fmt.Print(x)
}
if _, err := strconv.Atoi("non-int"); err != nil {
fmt.Println(err)
}
// learnConcurrency()
}
「同時実行処理」
learngo10.go
func inc(i int, c chan int) {
c <- i + 1
}
func learnConcurrency() {
c := make(chan int)
go inc(0, c)
go inc(10, c)
go inc(-805, c)
fmt.Println(<-c, <-c, <-c)
cs := make(chan string)
8. ccs := make(chan chan string)
go func() { c <- 84 }()
go func() { cs <- "wordy" }()
select {
case i := <-c:
fmt.Printf("it's a %T", i)
case <-cs:
fmt.Println("it's a string")
case <-ccs:
fmt.Println("didn't happen.")
}
// learnWebProgramming()
}
「Webアプリケーション」
learngo11.go
func learnWebProgramming() {
err := http.ListenAndServe(":8080", pair{})
fmt.Println(err)
}
func (p pair) ServeHTTP(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("You learned Go in Y minutes!"))
}