Skip to content
閲覧中:
Go言語

以下の構成で「Go言語 入門編」を作るのがよいです。

Go言語 入門編

  1. 全体像

Goは、次の用途に向いています。

用途 g向き不向き
CLIツール g◎
Web API g◎
並行処理 g◎
CSV/JSON処理 g◎
サーバープログラム g◎
GUIアプリ g△
DataFrame処理 g△〜○

公式ドキュメントでは、標準ライブラリとGoツール群がかなり重視されています。まずは外部パッケージより、fmt、os、io、bufio、encoding/csv、encoding/json、net/http、database/sql あたりを覚えるのが定石です。

第1章 環境構築編

1. Goのインストール

Ubuntu 24なら、まずはこれで十分です。

Bash
sudo apt update
sudo apt install -y golang-go
go version

Ubuntu公式ドキュメントでも sudo apt install golang-go が案内されています。

最新版を使いたい場合は、Go公式のインストール手順に従って /usr/local/go に入れる方法もあります。

2. PATH設定

~/.bashrc に追加します。

Bash
export PATH="$HOME/go/bin:$PATH"

反映します。

Bash
source ~/.bashrc

3. 開発用ツール

Bash
go install golang.org/x/tools/gopls@latest
go install golang.org/x/tools/cmd/goimports@latest

確認します。

Bash
which go
which gopls
which goimports
go version

4. 最初のプロジェクト

Bash
mkdir -p ~/Documents/go/hello
cd ~/Documents/go/hello
go mod init example.com/hello

main.go

package main
import "fmt"
func main() {
    fmt.Println("Hello, Go")
}

実行。

Bash
go run .

ビルド。

Bash
go build
./hello

第2章 Neovim設定編

最低限ほしいものはこれです。

機能 gツール
補完・定義ジャンプ ggopls
自動整形 ggofmt / goimports
import整理 ggoimports
静的解析 ggolangci-lint

golangci-lint は、多数のGo向けlinterをまとめて実行できるツールです。公式にも高速なGo linter runnerとして説明されています。

インストール例。

Bash
go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest
確認。

Bash
golangci-lint --version

第3章 基本文法編

まず覚える順番はこれです。

1. 変数

Go
package main
import "fmt"
func main() {
    name := "yossym"
    age := 20
    fmt.Println(name)
    fmt.Println(age)
}

2. if

Go
if age >= 20 {
    fmt.Println("adult")
} else {
    fmt.Println("child")
}

3. for

Goには基本的に while がありません。for を使います。

Go
for i := 0; i < 10; i++ {
    fmt.Println(i)
}

while風。

Go
i := 0
for i < 10 {
    fmt.Println(i)
    i++
}

無限ループ。

Go
for {
    fmt.Println("loop")
}

4. 配列より slice

Goでは配列より slice をよく使います。

Go
names := []string{"Tanaka", "Suzuki", "Sato"}
for i, name := range names {
    fmt.Println(i, name)
}

5. map

Go
scores := map[string]int{
    "国語": 80,
    "数学": 90,
}
fmt.Println(scores["数学"])

第4章 関数・エラー処理編

Goの定石は、

Go
結果, エラー := 関数()
if エラー != nil {
    return エラー
}

です。

例。

Go
package main
import (
    "fmt"
    "os"
)
func main() {
    data, err := os.ReadFile("sample.txt")
    if err != nil {
        fmt.Println("読み込みエラー:", err)
        return
    }
    fmt.Println(string(data))
}
Goでは例外ではなく、error を戻り値で返す書き方が基本です。

第5章 ファイル処理編

テキストファイル読み込み

Go
package main
import (
    "fmt"
    "os"
)
func main() {
    data, err := os.ReadFile("sample.txt")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(string(data))
}

1行ずつ読む

Go
package main
import (
    "bufio"
    "fmt"
    "os"
)
func main() {
    file, err := os.Open("sample.txt")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer file.Close()
    scanner := bufio.NewScanner(file)
    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }
    if err := scanner.Err(); err != nil {
        fmt.Println(err)
    }
}

第6章 CSV編

あなたの場合、CSVを扱うことが多いと思うので重要です。

Go
package main
import (
    "encoding/csv"
    "fmt"
    "os"
)
func main() {
    file, err := os.Open("sample.csv")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer file.Close()
    reader := csv.NewReader(file)
    records, err := reader.ReadAll()
    if err != nil {
        fmt.Println(err)
        return
    }
    for _, row := range records {
        fmt.Println(row)
    }
}

大きいCSVなら ReadAll() は避けて、1行ずつ読みます。

Go
for {
    row, err := reader.Read()
    if err != nil {
        break
    }
    fmt.Println(row)
}

第7章 JSON編

Go
package main
import (
    "encoding/json"
    "fmt"
)
type User struct {
    Name string `json:"name"`
    Age  int    `json:"age"`
}
func main() {
    text := `{"name":"yossym","age":20}`
    var user User
    err := json.Unmarshal([]byte(text), &user)
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(user.Name)
    fmt.Println(user.Age)
}

第8章 構造体編

Goではクラスではなく struct を使います。

Go
type User struct {
    Name string
    Age  int
}
func main() {
    user := User{
        Name: "Tanaka",
        Age:  30,
    }
    fmt.Println(user.Name)
}

メソッドも作れます。

Go
func (u User) Hello() {
    fmt.Println("Hello", u.Name)
}

第9章 並行処理編

Goの特徴です。

Go
package main
import (
    "fmt"
    "time"
)
func main() {
    go func() {
        fmt.Println("goroutine")
    }()
    time.Sleep(time.Second)
}

チャンネル。

Go
ch := make(chan string)
go func() {
    ch <- "hello"
}()
msg := <-ch
fmt.Println(msg)

第10章 Web API編

標準ライブラリだけでWebサーバーを書けます。

Go
package main
import (
    "fmt"
    "net/http"
)
func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello Web")
    })
    http.ListenAndServe(":8080", nil)
}

実行。

Go
go run .

確認。

Bash
curl http://localhost:8080

第11章 便利パッケージ編

まず覚える標準ライブラリ

パッケージ 用途
fmt 表示
os ファイル・環境変数
io 入出力
bufio 1行ずつ読む
strings 文字列処理
strconv 文字列と数値変換
time 日付時刻
encoding/csv CSV
encoding/json JSON
net/http Web
database/sql DB

外部パッケージ

パッケージ 用途
github.com/spf13/cobra CLIコマンド作成
github.com/spf13/viper 設定ファイル
github.com/gin-gonic/gin Web API
github.com/jmoiron/sqlx DB操作
github.com/joho/godotenv .env 読み込み
github.com/rs/zerolog ログ
github.com/stretchr/testify テスト補助

第12章 Goの定石編

1. 必ず go fmt

Goはフォーマットを人間が悩まず、gofmt に任せる文化です。公式の Effective Go でも、フォーマットは機械に任せる考え方が説明されています。

Go
go fmt ./...

2. import整理は goimports

Go
goimports -w .

3. 小さく作る

Goでは、まずこれくらいの構成で十分です。

Go
hello/
├── go.mod
└── main.go

少し大きくなったら。

Go
myapp/
├── go.mod
├── main.go
├── config.go
├── csv.go
└── server.go

さらに大きくなったら。

Go
myapp/
├── go.mod
├── cmd/
   └── myapp/
       └── main.go
├── internal/
   ├── config/
   ├── csvutil/
   └── server/
└── README.md

4. エラーは握りつぶさない

  • 悪い例。
Go
data, _ := os.ReadFile("sample.txt")
  • 良い例。
    Go
    data, err := os.ReadFile("sample.txt")
    if err != nil {
        return err
    }
    

5. 大きいCSVは一括読み込みしない

  • 悪い例。

    Go
    records, err := reader.ReadAll()
    

  • 良い例。

    Go
    for {
        row, err := reader.Read()
        if err != nil {
            break
        }
        // 1行ずつ処理
        _ = row
    }
    

おすすめ学習順

  1. 環境構築
  2. go run / go build / go mod
  3. 変数・if・for・slice・map
  4. 関数
  5. エラー処理
  6. struct
  7. ファイル読み書き
  8. CSV
  9. JSON
  10. Web API
  11. goroutine / channel
  12. DB / DuckDB / SQLite

まずは次に、

「Go言語 入門編 第1章:Ubuntu 24で環境構築」

として、コマンドを上から順番に実行できる形で作るのがよいと思います。