Go言語_1 - iosysRyoKoyasumi/learning GitHub Wiki

参考資料

YouTube視聴メモ

1. Go言語とは

  • 2009年にGoogleが開発したプログラミング言語。もともとはLinux、Macのみで実行可能だったが、2012年の正式verでWindowsにも対応し、現在はandoroidやiOSアプリ開発も行うことができる。
  • C言語をベースに開発されたコンパイラ言語で、Cと同等の高速な処理速度とCよりもシンプルに記述できる点がメリットである。シンプルさ故に可読性が高く、誰が書いても同じようなコードになるという点も優れている。

2. 環境構築

3. 実行方法

Go言語はコンパイラ言語のため実行時にコンパイルを行う必要がある。 以下のディレクトリにgoファイルがあったとする C:\Users\[ユーザー名]\Documents\GoLang

package main 
// mainパッケージに属するエントリーポイント

import (
	"fmt"
)
// "fmt"(フォーマット)をインポート

func main() {
	fmt.Println("HelloWorld")
	fmt.Println("HelloGo")
	// 文字列を出力する処理↑
}

コマンド上でビルドと実行を行うことができる

C:\Users\koyasumi\Documents\GoLang>go build greeting.go
// ここで同じディレクトリに実行用のexeファイルが生成される
C:\Users\koyasumi\Documents\GoLang>.\greeting
HelloWorld
HelloGo

buildと実行を同時に行えるコマンド

C:\Users\koyasumi\Documents\GoLang>go run Greeting.go
HelloWorld
HelloGo

4. 変数

書き方

// パターン1
var num int
num = 1
// パターン2
var num int = 1 
// パターン3
num := 1

ルール

  • 変数名には「文字列」「数字」「アンダースコア_」のみ利用することができる。
  • 変数名を数字から始めることはできない
  • アンダースコア以外の記号を利用することはできない
  • 大文字と小文字をは区別される ※一文字目が小文字の場合はprivateな変数や関数、大文字の場合はpublicな変数や関数
  • 予約語 (あらかじめ役割が決まっている言語) は変数名として使用できない
// 例
num01 = 1   // OK
num_02 = 2  // OK
03num = 3   // ERROR
$num04 = 4  // ERROR

5. データ型

Go言語はJavaと同様に静的型付け言語のため、変数名にデータを入れる際にデータ型を指定する必要がある。

数値型

整数型 int8、int16、int32、int64と数字が大きくなるにつれて格納可能な整数の桁数が大きくなる。 とりあえず「int」で宣言しておけば問題ない 少数型 float32、float64があり、float64のほうが格納可能桁数が大きい。 「float64」を利用しておけば問題ない 文字列(string)型 string型 ダブルクォーテーション(““)で文字列囲って使用する。 bool型 true or falseのどちらか片方を保持する。

配列

一次元配列

// 変数 := [要素数]データ型{データ1, データ2, ......}
array := [3]string{"sato", "suzuki", "takahasi"}
fmt.Println(array[0])
fmt.Println(array[1])
fmt.Println(array[2])

array[1] = "tanaka" // 配列の要素変更

// 要素数を省略した書き方
// 変数 := [...]データ型{データ1, データ2, ......}
array := [...]string{"sato", "suzuki", "takahasi"}

二次元配列

matrix := [2][2]string{{"sato", "tokyo"}, {"tanaka", "saitama"}}
fmt.Println(matrix[0][0]) // sato
fmt.Println(matrix[0][1]) // tokyo

6. 演算子

算術演算子

 x := 10
 y := 2
 
 fmt.Println(x + y) 
 fmt.Println(x - y)
 fmt.Println(x * y)
 fmt.Println(x / y)
 fmt.Println(x % y) //剰余(割ったあまり)

関係演算子

x := 10
y := 2

fmt.Println(x > y) // True
fmt.Println(x < y) // False
fmt.Println(x == y) // False 
fmt.Println(x != y) // True

論理演算子

x := 8
y := 3
// &かつ
fmt.Println(x >= 5 && x <= 10) // True
fmt.Println(y >= 5 && y <= 10) // False
// orまたは
fmt.Println(x == 3 || y == 3) // True 
fmt.Println(x == 1 || y == 1) // False

代入演算子

x := 8
y := 12
z := 20

x += 10
z += y 

fmt.Println(x) // 18
fmt.Println(z) // 32

インクリメント

x := 8
y := 8

x++
y--

fmt.Println(x) // 9
fmt.Println(y) // 7

7. 条件分岐

通常の記法

// if文
age := 20
if age >= 20 {
  fmt.Println("adult")
}
// "adult"が表示

// if else文
age := 18
if age >= 20 {
  fmt.Println("adult")
}else{
  fmt.Println("child")
}
// "child"が表示

// if else if else 文
age := 0
if age >= 20 {
  fmt.Println("adult")
} else if age == 0 {
  fmt.Println("baby")
} else {
  fmt.Println("child")
}
// "baby"が表示

省略した記法

if age := 0; age >= 20 { // 変数の宣言をif分の条件定義の部分で行える
  fmt.Println("adult")
}else if{ 
  //
}else{]
  //
}

x := 0
if age := x + y; age >= 20 {
  //
}
// スコープがif分の中に指定されているので注意

8. 繰り返し

基本

// for スタート値 ; 継続条件 ; 増減式 {}
for i:=0 ; i <= 4 ; i++ {
  fmt.Println(i)
}

// break
for i:=0 ; i <= 4 ; i++ {
  if i == 3 {
    break // ここでforが止まる
  }
}

// continue
for i:=0 ; i <= 4 ; i++ {
  if i == 3 {
    continue // ここでスッキプ
  }
}

ネスト

for i:=0 ; i<=2 ; i++{
  for j:=0 ; j<=2 ; j++{
    fmt.Println(i, "-", j)
    // 0-0, 0-1, 0-2....と出力される
  }
}

配列

arr := [...]int{2, 4, 6, 8, 10}
for i := 0; i <= 4; i++ {
  fmt.Println(arr[i])
  // 配列の中身が順番に出力
}

省略した記法

i := 0
for i <=  4 {
  fmt.Println(i)
  i++
  // 0~4まで順に出力
}

9. 関数

引数なし

//基本構造
func 関数名 (引数名 データ型) { // 引数は省略可
  処理
}

// 関数の宣言
func sayHello() {
	fmt.Println("Hello World")
}

// 関数名()で使用可
func main() {
	sayHello()
}

引数あり

func seyHello (greeting string) {
  fmt.Println(greeting)
}

func main() {
	sayHello("Good Mornig")
}

// 同型の引数が複数ある場合
func cal (x, y int) {
  fmt.Println(x + y)
}

★Javaと異なり引数名とデータ型が逆なので注意

戻り値あり

// 戻り値が一つ
func cal (x, y int) int {
  return (x / y)
}

func main () {
  result := cal(6, 3)
  fmt.Println(result)
}

// 戻り値が二つ以上 パターン1
func cal (x, y int) (int, int) {
  return (x / y), (x * y)
}

func main () {
  result01, result02 := cal(6, 3)
  fmt.Println(result01, result02)
}

// パターン2
func cal (x, y int) (a int, b int) {
  a := x / y
  b := x * y
  return
}

関数式

// 変数名に関数を格納することができる
func main () {
  hello := func(greeting string) {
    fmt.Println(greeting)
  }
  hello("Good Morning")
}

10. 構造体

  • 異なるデータ型の変数を複数にまとめたもの
  • 構造体を作る=構造体を定義する
  • 構造体の中に定義した変数=フィールド
  • フィールドには変数と同じように、数値や文字列を代入したり、参照したりできる
  • Javaのdomain的なイメージ
type 構造体 struct {
  フィールド1
  フィールド2
}
// 構造体の定義
type Student struct {
  name string
  math, english float64
}

// 構造体の利用 パターン1
func main() {
  // 構造体の初期化
  // var 構造体を代入する変数名 構造体名
  var s Student
  
  s.name = "sato"
  s.math = "80"
  s.english = "70"
}

// パターン2
func main () {
  // 構造体の宣言と同時に代入することができる
  // 構造体のフィールド名と同じ順番で値を渡す必要がある
  // すべてのフィールドに値を渡す必要がある
  s := Student{"sato", 80, 70}
}

11. メソッド

  • 構造体などの特定の型に関連づけられた関数
  • Go言語の指すメソッドはほかのプログラミング言語のメソッドとは意味が異なる 他言語だとメソッドはクラスの中に記述されるものだが、Go言語にはクラスという概念が存在せず、構造体の中には記述しない
type Student struct {
  name string
  math, english float64
}

// メソッドの記述
// 構造体との関連付け
func (s Student) avg() {
  fmt.Println(s.name, (s,math + s.english) / 2)
}
// (s Student)の部分を「レシーバ」と呼ぶ

// メソッドの使い方
func main () {
  // フィールドに値の挿入
  a001 := Student{"sato", 80, 70}
  // メソッドの使用
  a001.avg()
}