Skip to content

Commit 3cab1f5

Browse files
authored
save
1 parent 61ffbb0 commit 3cab1f5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+2526
-0
lines changed

content/ja/docs/README.md

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# サンプルで学ぶ Go 言語
2+
3+
[Go](http://golang.org/) はオープンソースのプログラミング言語であり、シンプルで高速、信頼性の高いソフトウェアを作るために設計された。
4+
5+
サンプルで学ぶ Go 言語は、説明付きのプログラムを使った、ハンズオン形式の Go 言語チュートリアルだ。 [最初の例](hello-world.md)に進んでもよいし、下にある一覧から読みたい例を探してよい。
6+
7+
<br>
8+
9+
<style>
10+
/* Make draft links from included SUMMARY.md on README.md non-clickable. */
11+
#content a[href=""] {
12+
color: var(--sidebar-non-existant);;
13+
text-decoration: none;
14+
cursor: default;
15+
pointer-events: none;
16+
}
17+
</style>
18+
19+
{{#include SUMMARY.md:7:}}

content/ja/docs/SUMMARY.md

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# Summary
2+
3+
[サンプルで学ぶ Go 言語](README.md)
4+
5+
---
6+
7+
- [Hello World](hello-world.md)
8+
- [Values](values.md)
9+
- [Variables](variables.md)
10+
- [Constants](constants.md)
11+
- [For](for.md)
12+
- [If/Else](if-else.md)
13+
- [Switch](switch.md)
14+
- [Arrays](arrays.md)
15+
- [Slices](slices.md)
16+
- [Maps](maps.md)
17+
- [Range](range.md)
18+
- [Functions](functions.md)
19+
- [Multiple Return Values](multiple-return-values.md)
20+
- [Variadic Functions](variadic-functions.md)
21+
- [Closures](closures.md)
22+
- [Recursion](recursion.md)
23+
- [Pointers](pointers.md)
24+
- [Structs](structs.md)
25+
- [Methods](methods.md)
26+
- [Interfaces](interfaces.md)
27+
- [Errors](errors.md)
28+
- [Goroutines](goroutines.md)
29+
- [Channels](channels.md)
30+
- [Channel Buffering](channel-buffering.md)
31+
- [Channel Synchronization](channel-synchronization.md)
32+
- [Channel Directions](channel-directions.md)
33+
- [Select](select.md)
34+
- [Timeouts](timeouts.md)
35+
- [Non-Blocking Channel Operations](non-blocking-channel-operations.md)
36+
- [Closing Channels](closing-channels.md)
37+
- [Range over Channels](range-over-channels.md)
38+
- [Timers](timers.md)
39+
- [Tickers](tickers.md)
40+
- [Worker Pools](worker-pools.md)
41+
- [WaitGroups](waitgroups.md)
42+
- [Rate Limiting](rate-limiting.md)
43+
- [Atomic Counters](atomic-counters.md)
44+
- [Mutexes](mutexes.md)
45+
- [Stateful Goroutines](stateful-goroutines.md)
46+
- [Sorting](sorting.md)
47+
- [Sorting by Functions](sorting-by-functions.md)
48+
- [Panic](panic.md)
49+
- [Defer](defer.md)
50+
- [Collection Functions](collection-functions.md)
51+
- [String Functions](string-functions.md)
52+
- [String Formatting](string-formatting.md)
53+
- [Regular Expressions](regular-expressions.md)
54+
- [JSON](json.md)
55+
- [XML](xml.md)
56+
- [Time](time.md)
57+
- [Epoch](epoch.md)
58+
- [Time Formatting / Parsing](time-formatting-parsing.md)
59+
- [Random Numbers](random-numbers.md)
60+
- [Number Parsing](number-parsing.md)
61+
- [URL Parsing](url-parsing.md)
62+
- [SHA1 Hashes](sha1-hashes.md)
63+
- [Base64 Encoding](base64-encoding.md)
64+
- [Reading Files](reading-files.md)
65+
- [Writing Files](writing-files.md)
66+
- [Line Filters](line-filters.md)
67+
- [File Paths](file-paths.md)
68+
- [Directories](directories.md)
69+
- [Temporary Files and Directories](temporary-files-and-directories.md)
70+
- [Testing](testing.md)
71+
- [Command-Line Arguments](command-line-arguments.md)
72+
- [Command-Line Flags](command-line-flags.md)
73+
- [Command-Line Subcommands](command-line-subcommands.md)
74+
- [Environment Variables](environment-variables.md)
75+
- [HTTP Clients](http-clients.md)
76+
- [HTTP Servers](http-servers.md)
77+
- [Context](context.md)
78+
- [Spawning Processes](spawning-processes.md)
79+
- [Exec'ing Processes](execing-processes.md)
80+
- [Signals](signals.md)
81+
- [Exit](exit.md)
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
# Multiple Return Values
2+
```go
3+
// Go は<em>多値の返り値</em>を組み込みでサポートしている。
4+
// この機能は Go のイディオムで使われることが多く、例えば結果とエラーの両方を関数から返す場合に使う。
5+
6+
package main
7+
8+
import "fmt"
9+
10+
// この関数のシグネチャにおける `(int, int)` は、この関数が2つの `int` 型の値を返すことを表している。
11+
func vals() (int, int) {
12+
return 3, 7
13+
}
14+
15+
func main() {
16+
17+
// ここでは2つの返り値を<em>多重代入</em>を使って受け取っている。
18+
a, b := vals()
19+
fmt.Println(a)
20+
fmt.Println(b)
21+
22+
// もし返り値のうちの一部だけが必要なら、ブランク識別子 `_` を使えばよい。
23+
_, c := vals()
24+
fmt.Println(c)
25+
}
26+
```
27+
```sh
28+
$ go run multiple-return-values.go
29+
3
30+
7
31+
7
32+
33+
# Go の関数の素敵な機能として、引数を何個でも受け取れる関数の書き方を次に紹介する。
34+
```

content/ja/docs/mutexes.md

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
# Mutexes
2+
```go
3+
// 前の例で、単純なカウンタの状態を[アトミックな操作](atomic-counters.html)で管理する方法を紹介した。
4+
// より複雑な状態を管理したいときには、[<em>ミューテックス(mutex)</em>](http://en.wikipedia.org/wiki/Mutual_exclusion)を使って複数のゴルーチンから安全にデータを読み書きすることもできる。
5+
6+
package main
7+
8+
import (
9+
"fmt"
10+
"math/rand"
11+
"sync"
12+
"sync/atomic"
13+
"time"
14+
)
15+
16+
func main() {
17+
18+
// 状態の例としてマップを使う。
19+
var state = make(map[int]int)
20+
21+
// この `mutex` を使って、`state` へのアクセスを同期する。
22+
var mutex = &sync.Mutex{}
23+
24+
// 読み操作・書き操作がそれぞれ何度行われたかをカウントする。
25+
var readOps uint64
26+
var writeOps uint64
27+
28+
// 100 個のゴルーチンを作り、それぞれが1ミリ秒ごとに state を繰り返し読み出す。
29+
for r := 0; r < 100; r++ {
30+
go func() {
31+
total := 0
32+
for {
33+
34+
// 読み出しのたびに、アクセスするキーを選ぶ。
35+
// `Lock()` で `mutex` をロックし、`state` への排他的なアクセスを獲得し、値を読み出し、`Unlock()` で `mutex` のロックを解除し、最後に `readOps` の値を1増やす。
36+
key := rand.Intn(5)
37+
mutex.Lock()
38+
total += state[key]
39+
mutex.Unlock()
40+
atomic.AddUint64(&readOps, 1)
41+
42+
// 読み出しのたびに少し待つ。
43+
time.Sleep(time.Millisecond)
44+
}
45+
}()
46+
}
47+
48+
// 10個のゴルーチンを起動し、読み出しと同様のパターンで書き込みを行う。
49+
for w := 0; w < 10; w++ {
50+
go func() {
51+
for {
52+
key := rand.Intn(5)
53+
val := rand.Intn(100)
54+
mutex.Lock()
55+
state[key] = val
56+
mutex.Unlock()
57+
atomic.AddUint64(&writeOps, 1)
58+
time.Sleep(time.Millisecond)
59+
}
60+
}()
61+
}
62+
63+
// 10個のゴルーチンが `state` や `mutex` で仕事をできるよう、一秒待つ。
64+
time.Sleep(time.Second)
65+
66+
// 結果を読み出して、読み書き操作のカウントを報告する
67+
readOpsFinal := atomic.LoadUint64(&readOps)
68+
fmt.Println("readOps:", readOpsFinal)
69+
writeOpsFinal := atomic.LoadUint64(&writeOps)
70+
fmt.Println("writeOps:", writeOpsFinal)
71+
72+
// `state` をロックして、最終的にどうなったかを表示する。
73+
mutex.Lock()
74+
fmt.Println("state:", state)
75+
mutex.Unlock()
76+
}
77+
```
78+
```sh
79+
# プログラムを実行した結果、`mutex` で同期した操作を合計で約90000回実行したことがわかる。
80+
$ go run mutexes.go
81+
readOps: 83285
82+
writeOps: 8320
83+
state: map[1:97 4:53 0:33 2:15 3:2]
84+
85+
# 続いて、同様の状態管理をゴルーチンとチャネルだけを使って実装する方法を紹介する。
86+
```
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
# Non-Blocking Channel Operations
2+
```go
3+
// 基本的なチャネルの送受信の使い方はブロックする。
4+
// しかし、`select` と `default` 節を使えば、<em>ノンブロッキング</em>な送受信や、選択的な受信を実装できる。
5+
6+
package main
7+
8+
import "fmt"
9+
10+
func main() {
11+
messages := make(chan string)
12+
signals := make(chan bool)
13+
14+
// これはノンブロッキングな受信である。
15+
// もし `messages` から値を受け取れるなら、`select` は `<-messages` の `case` 節で、その値を受け取る。
16+
// そうでなければ、`default` 節に直ちに進む。
17+
select {
18+
case msg := <-messages:
19+
fmt.Println("received message", msg)
20+
default:
21+
fmt.Println("no message received")
22+
}
23+
24+
// ノンブロッキングな送信も同様だ。
25+
// ここでは `msg` を `messages` チャネルに送信できない。
26+
// なぜならチャネルにバッファは付いておらず、受信者もいないからである。
27+
// そのため、`default` 節に進む。
28+
msg := "hi"
29+
select {
30+
case messages <- msg:
31+
fmt.Println("sent message", msg)
32+
default:
33+
fmt.Println("no message sent")
34+
}
35+
36+
// `default` 節の前に複数の `case` を書けば、複数のチャネルから選択的かつノンブロッキングに受信できる。
37+
// ここでは `messages` と`signals` からノンブロッキング受信を試みている。
38+
select {
39+
case msg := <-messages:
40+
fmt.Println("received message", msg)
41+
case sig := <-signals:
42+
fmt.Println("received signal", sig)
43+
default:
44+
fmt.Println("no activity")
45+
}
46+
}
47+
```
48+
```sh
49+
$ go run non-blocking-channel-operations.go
50+
no message received
51+
no message sent
52+
no activity
53+
```

content/ja/docs/number-parsing.md

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# Number Parsing
2+
```go
3+
// 文字列から数値へのパースは、多くのプログラムに現れるパターンである。
4+
// ここでは、Go でのやり方を紹介する。
5+
6+
package main
7+
8+
// `strconv` パッケージを使って数をパースできる。
9+
import (
10+
"fmt"
11+
"strconv"
12+
)
13+
14+
func main() {
15+
16+
// `ParseFloat` の `64` は何ビットの精度でパースするかを指定する。
17+
f, _ := strconv.ParseFloat("1.234", 64)
18+
fmt.Println(f)
19+
20+
// `ParseInt` の `0` は基数を文字列から推測させることを表す。
21+
// `64` は、結果が64ビットに収まることを要求する。
22+
i, _ := strconv.ParseInt("123", 0, 64)
23+
fmt.Println(i)
24+
25+
// `ParseInt` は8進記数法で書かれた文字列をパースできる。
26+
d, _ := strconv.ParseInt("0x1c8", 0, 64)
27+
fmt.Println(d)
28+
29+
// `ParseUint` もある。
30+
u, _ := strconv.ParseUint("789", 0, 64)
31+
fmt.Println(u)
32+
33+
// `Atoi` は基数が10の `int` 型の値をパースするときに便利である。
34+
k, _ := strconv.Atoi("135")
35+
fmt.Println(k)
36+
37+
// パースする関数は、入力の形式が正しくないとエラーを返す。
38+
_, e := strconv.Atoi("wat")
39+
fmt.Println(e)
40+
}
41+
```
42+
```sh
43+
$ go run number-parsing.go
44+
1.234
45+
123
46+
456
47+
789
48+
135
49+
strconv.ParseInt: parsing "wat": invalid syntax
50+
51+
# パース対象としてこちらも頻出である URL をパースするやり方を紹介する。
52+
```

content/ja/docs/panic.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Panic
2+
```go
3+
// `panic` は予期せぬ問題が起きたことを示すために使う。
4+
// これは普通は起きるはずがない問題が起きたり、うまく対処できない問題が起きた場合に、なるべく早くプログラムを停止させるために使う。
5+
6+
package main
7+
8+
import "os"
9+
10+
func main() {
11+
12+
// このウェブサイトでは、予期せぬエラーが発生した場合に `panic` を使う。
13+
// この行だけが、意図的に panic を呼んでいる箇所である。
14+
panic("a problem")
15+
16+
// 関数がエラーを返し、そのエラーにどう対処すべきがわからない(または対処したくない)場合に、panic を呼んでプログラムを中断するのは、panic の典型的な使い方である。
17+
// この例では、ファイルを作るときにエラーが発生したら、panic を呼んでいる。
18+
_, err := os.Create("/tmp/file")
19+
if err != nil {
20+
panic(err)
21+
}
22+
}
23+
```
24+
```sh
25+
# プログラムを実行するとパニックが発生し、
26+
# エラーメッセージとゴルーチンのトレースが表示され、
27+
# 非ゼロのステータスでプログラムは終了する。
28+
$ go run panic.go
29+
panic: a problem
30+
31+
goroutine 1 [running]:
32+
main.main()
33+
/.../panic.go:12 +0x47
34+
...
35+
exit status 2
36+
37+
# 例外を使って多くのエラーを処理する言語とは違って、
38+
# Go ではエラーの有無を返り値として返すのが普通であることに注意する。
39+
```

0 commit comments

Comments
 (0)