Javaとの主な構文の違い:
1) ++iは存在せず、i++のみ使用可能。whileループはなく、「for 条件」で代替。未使用の変数は定義不可。
整数型のmax、min、abs関数は標準で提供されていない。
2) 配列のサイズが定数でない場合、makeキーワードを使用してsliceを定義する必要がある。
クラスはなく、funcのみ存在。クラスに相当するものはstructキーワードで定義する。
3) Goでは初期化されていないslice、map、channelはnilキーワードで判定できる。
Go言語の特殊キーワード:
| キーワード | 説明 |
|---|---|
| range | array、slice、channel、mapを反復処理する。arrayではインデックスと値を、mapではキーと値を返す |
| append | append(slice,要素)でsliceに要素を追加する |
// range構文の例、iはインデックス、valueは要素値
for i, value := range data {}
基本テンプレート
package main
import "fmt"
import "sort"
//import "math"
//import "strings"
func main(){
var size, limit int
fmt.Scanf("%d %d", &size, &limit)
data := make([]int, size)
for i := 0; i < size; i++{
fmt.Scan(&data[i])
}
sort.Ints(data)
result := 0
fmt.Printf("%d", result)
}
func min(x, y int) int { if y < x { return y }; return x }
func max(x, y int) int { if y > x { return y }; return x }
func abs(x int) int { if x >= 0 { return x}; return -x }
1. 入出力(OJ向け)
fmtパッケージの公式ドキュメントには以下の4つの主要部分があります:
- Constants(定数)
- Variables(変数)
- Functions(関数)
- Types(型)
入出力にはfmtパッケージのインポートが必要です。
fmt.Scan(&count)
-----------------------------
var capacity, value [3]int
for i := 0; i < 3; i++ {
fmt.Scanf("%d %d", &capacity[i], &value[i])
}
----------------------------------------
package main
import "fmt"
func main(){
var num int
var text string
fmt.Scan(&num)
fmt.Scan(&text)
chars := []byte(text)
fmt.Printf("%d\n", result)
}
func min(x, y int) int { if y < x { return y }; return x }
func max(x, y int) int { if y > x { return y }; return x }
2. 文字列操作
var chars = []byte("hello world") // stringを文字配列に変換
var str = string(chars) // 文字配列をStringに変換
Goではstringは不変(immutable)です。
可変文字列
JavaのStringBuilderに相当する機能はstrings.Builderを使用します。
var builder strings.Builder
builder.WriteString("start") // 文字列を書き込む
builder.Len() // 文字列長を返す
builder.String() // String型を返す
builder.WriteByte(c byte) // 単一文字を書き込む
3. 配列(スライス)
配列とスライスの違い:
1) スライスは参照型、配列は値型
2) 配列の長さは固定、スライスは可変(動的配列)
3) スライスには配列にない属性がある:容量(cap)
4) スライスの基礎となるデータ構造は配列
配列の定義
var collection [3]int // 要素数3のint型配列を定義
ソート機能
ソートには公式のsortパッケージを使用します。主な関数:
func Ints(x []int) // int型スライスを昇順ソート
func Float64s(x []float64) // float64型スライスを昇順ソート
func Strings(x []string) // string型スライスを昇順ソート
func Slice(x any, less func(i, j int) bool) // カスタム比較関数によるソート
カスタム構造体のソート
// 例:v属性に基づいてカスタム構造体をソート
type Item struct {
name string
value int
}
sort.Slice(items, func(i, j int) bool {
return items[i].value < items[j].value
})
二次元スライスの定義
matrix := make([][]int, rows)
for i := range matrix {
matrix[i] = make([]int, cols)
}
----------------------------------------------
for i := 0; i < 3; i++
スライスのコピー
target := source[:] // 浅いコピー、メモリを共有
========================================
destination := make([]type, len(source))
copy(destination, source) // 深いコピー
=========================================
4. mathパッケージ
定義されている主な定数:
MaxInt32 = 1<<31 - 1
MinInt32 = -1 << 31
MaxInt64 = 1<<63 - 1
MinInt64 = -1 << 63
</code>
5. mapの使用
dataMap := make(map[string]int, 100) // keyがstring、valueがintのmapを定義
for key, val := range dataMap {} // rangeキーワードでmapのkeyとvalueを反復処理
dataMap[key]++ // valueを1増加させる
6. スライスを使用したグラフの隣接リスト
graph := make([][]int, vertexCount+1)
for i := 1; i <= vertexCount; i++ {
graph[i] = make([]int, 0, 10) // 0は実際の動的配列長、10は初期容量
}
graph[u] = append(graph[u], v) // 動的配列に要素を追加