変数の作り方
変数の宣言
変数を宣言するにはvarを使う。varのあとに変数名、変数の型と続ける。さらに初期化も行いたいときは=と代入したい値を入れる
var i int = 1
複数の変数を宣言したいときはvarのあとに()で囲って宣言を行う
var(
i int
f64 float64
s string
)
短縮変数宣言、ということもできる。変数名と値を:=でつなげることで行うことができる。ただし、この場合変数の型は自動で判別される。
xi := 1
xf := 1.2
(注意)変数の宣言として、varを使う場合は関数の外でも宣言ができて、複数の関数から呼び出すことができるが、短縮変数宣言の場合は関数内での宣言しか行えない。
定数の宣言
定数の宣言はconstを使用して行うことができる。constで宣言した値はあとから変更することができないため、宣言時に初期化を同時に行う。また、基本的に関数外で宣言を行う。
const Pi = 3.14
データ構造
配列
配列もvarを使って宣言する。配列名[要素数]データ型、という形で宣言する。
int型の要素を2つもつaという配列を宣言し、0番目と1番目に値を代入したい場合は以下のようにする。
var a [2]int
[0] = 100
[1] = 200
また、宣言時に値を代入する場合は以下のように行う。
a := [2]int{100,200}
スライス
スライスを宣言する場合も配列の宣言と大して変わらない。[]内に要素数を入れないだけ
n := []int{1,2,3,4,5}
スライス内の要素を書き換えるには、スライス名[書き換えたい要素のインデックス]で行う。
n[2] = 100
//これによりnの中身は{1,2,100,4,5}となる
要素を追加したいとき
スライスに要素を追加したいときはappendを使用する。
第一引数に対象のスライス、第二引数に追加したい値をいれる。また、追加したい値を,で区切って同時に追加することもできる。
append(n,100)
//nの中身は{1,2,100,4,5,100}となる。
append(n,200,300)
//nの中身は{1,2,100,4,5,200,300}となる
make関数
make関数を使用することで要素の値が0で初期化されたスライスを作ることができる。例えば、要素数3,容量5のスライスnを作りたいときは以下のように行う。
n := make ([]int,3,5)
//nは[0,0,0]
※容量とは?
容量とは、スライスが占有する内部配列のサイズのことで、スライスの要素数が len(長さ)を超えるときに新しいメモリ割り当てが発生するのを防ぐためのもの。
容量を指定することで、スライスが拡張されるたびに新しいメモリ割り当てとコピーが発生するコストを減らすことができる。
AIに聞いたところ、一々容量を決定するようにすると具体的に以下のコストが発生する。なるほど。
スライスがその現在の容量を超えて拡張されると、新しいより大きな配列が作成され、その既存の要素が新しい配列にコピーされます。これには以下のようなコストが伴います:
新しいメモリの割り当て: 新しい配列を作成するために追加のメモリが必要です。
要素のコピー: 既存の要素を新しい配列にコピーする必要があります。これが大きなスライスの場合、コピー操作に時間がかかることがあります。
ガベージコレクション: 古い配列はもはや使用されなくなるため、ガベージコレクションが発生し、システムリソースの負荷となることがあります。
作成したスライスに要素を追加する。
append(n,0,0)
//nは[0,0,0,0,0]となる
append(n,100,200,300)
//このときnは[0,0,0,0,0,100,200,300]となる。また、容量は設定した5を超えている。このようなときは一般的に現在の容量の2倍になる。(追加する要素の数次第だが)
Map
mapはキーとバリューの組み合わせをまとめることのできるデータ構造。
map[キーのデータ型]値のデータ型{キー1:値1,キー2:値2,…}という形で宣言できる。
m := map[string]int{"apple":100,"orange":200}
//この時点でmap mの中身は以下
map[apple:100 orange:200]
要素の書き換え方法は以下
m["orange"] = 300
//これによりmap mの中身は以下のようになる
map[apple:100 orange:300]
要素の追加方法は以下
m["banana"] = 500
//これによりmap mの中身は以下のようになる
map[apple:100 orange:300 banana:500]
学習に使用した教材
・『入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)』M.A EduTech
https://www.udemy.com/course/golang-webgosql/?utm_medium=udemyads&utm_source=bene-msa&utm_campaign=responsive&utm_content=top-1&utm_term=general&msclkid=81e2f24a32cc185d275d953d60760226&couponCode=NEWYEARCAREERJP
・『シリコンバレー一流プログラマーが教える Goプロフェッショナル大全』酒井 潤 (著)
https://www.amazon.co.jp/%E3%82%B7%E3%83%AA%E3%82%B3%E3%83%B3%E3%83%90%E3%83%AC%E3%83%BC%E4%B8%80%E6%B5%81%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Go%E3%83%97%E3%83%AD%E3%83%95%E3%82%A7%E3%83%83%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E5%A4%A7%E5%85%A8-%E9%85%92%E4%BA%95-%E6%BD%A4/dp/4046070897