go-lang-dev/docs/go言語.md
2025-03-09 17:29:30 +09:00

210 lines
4.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## Go言語の特徴
* シンプル & 高速
* 文法がシンプルで読みやすい
* コンパイルが速く、実行時も高速
* 静的型付け
* int, string, bool などの型を明示(または推論)
* 並行処理が得意goroutine & channel
* 軽量スレッドgoroutineを使って並行処理が簡単
* 単一バイナリでデプロイ
* 依存関係を含む1つのバイナリで配布可能
* ガベージコレクションGCあり
* 手動でメモリ管理しなくてもOK
* クロスコンパイルが簡単
* Windows, Linux, macOS用のバイナリを簡単に作れる
* Go言語にclassはない
* 構造体(struct)+メソッド+インターフェースでオブジェクト指向のような設計は可能
## 構文例
```go
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
```
* package
* 名前空間Namespaceのようなものです。
* `package main` は、Goプログラムのエントリーポイント実行可能なプログラム を示します。
* `import "fmt"`
* 標準ライブラリのfmtパッケージ(文字列出力などの機能を持つ)です。
## 書き方
### 変数について
```go
func main() {
var message string = "Hello, Go!"
fmt.Println(message)
// 型推論
num := 42
fmt.Println(num)
}
```
* `var`を使って明示的に型を指定できる
* `:=`を使うと、型推論で自動的に型が決まる(関数内のみ)
### 配列・MAP(連想配列/辞書)
#### 配列の扱い方
配列(固定長)
```go
// 配列(固定長)
var arr [3]int = [3]int{1, 2, 3}
fmt.Println(arr)
```
配列(可変長)
```go
// 配列(固定長)
slice := []int{1, 2, 3, 4, 5}
fmt.Println(slice)
// スライスの追加append
slice = append(slice, 6)
fmt.Println(slice)
// スライスの部分取り出し
fmt.Println(slice[1:4]) // [2,3,4]
```
#### MAP(連想配列/辞書)の扱い方
```go
// マップの作成
user := map[string]int{
"Alice": 25,
"Bob": 30,
}
fmt.Println(user)
// 値の取得
age := user["Alice"]
fmt.Println("Alice's age:", age)
```
キーの存在チェック
```sh
if val, exists := user["Charlie"]; exists {
fmt.Println("Charlie is", val)
} else {
fmt.Println("Charlie not found")
}
```
キーの削除
```
delete(user, "Bob")
fmt.Println(user)
```
### 構造体(struct)
* C言語のstructと似ています
* `.` を使ってフィールドにアクセス
```go
// 構造体の定義
type User struct {
Name string
Age int
}
func main() {
// インスタンス生成
u := User{Name: "Alice", Age: 25}
fmt.Println(u)
// フィールドの変更
u.Age = 26
fmt.Println(u)
}
```
structにメソッドを定義する
```go
// メソッドの定義(クラスのメソッドに相当)
func (u User) Greet() {
fmt.Println("Hello, my name is", u.Name)
}
```
### 関数について
funcで関数を定義
```go
func greet(name string) string {
return "Hello, " + name
}
```
### 条件分岐
**if文**
* ifは( )が不要
```go
if x > 5 {
fmt.Println("x is greater than 5")
} else {
fmt.Println("x is 5 or less")
}
```
### Goroutine(並行処理)
* goをつけると新しいGoroutine(軽量スレッド)として並行実行される
```go
package main
import (
"fmt"
"time"
)
func printMessage(msg string) {
for i := 0; i < 5; i++ {
fmt.Println(msg)
time.Sleep(time.Millisecond * 500)
}
}
func main() {
go printMessage("Hello") // 並行処理で実行
go printMessage("World") // 並行処理で実行
time.Sleep(time.Second * 3) // メインスレッドが終了しないように待つ
}
```
---
## Go言語のプロジェクトを実行する
```sh
go mod init <モジュール名>
```