配列 / スライス【夏休みにGo vol.8】

こんにちは、しーたです。
今日は配列とスライスについて学んでいきます。

 

①配列

基本的に他の言語と同じです。
ただし、配列はリサイズができません。

func main() {
    var a [2]int //配列
    a[0] = 100
    a[1] = 200
    fmt.Println("a =", a)
    //a = append(a, 300) ×配列はサイズを変更できない
}

 

f:id:theta04:20200803213518p:plain

 

②スライス

スライスは、長さの決まっていない配列みたいなものです。
appendを使って要素の追加が可能です。

もちろん、配列やスライスを入れ子構造にすることもできます。

func main() {
    var b int = int{1234//スライス
    fmt.Println("b =", b)           //全要素の表示
    b = append(b, 56)             //スライスはリサイズ可能
    fmt.Println(b)

    fmt.Println("b[2] =", b[2]) //index3の要素を表示
    fmt.Println(b[2:4])         //index2-4の表示
    fmt.Println(b[:4])          //index0-4の表示
    fmt.Println(b[4:])          //index4-5の表示
    fmt.Println(b[:])           //index0-5の表示

    b[2] = 10 //要素の書き換え
    fmt.Println(b)

    var matrix = int//スライス内にスライス
        int{012},
        int{345},
        int{678},
    }
    fmt.Println(matrix)
}

↓実行結果

f:id:theta04:20200803213623p:plain

 

③スライスのmake, cap, len

makeを使ってスライスを宣言することもできます。引数は「型, 要素数, 容量」で

素数(length) = 要素の数
容量(capacity) = 何要素分メモリを確保しているか

です。容量を指定しなければ「容量=要素数」となります。

appendで容量が足りなくなると、自動で2倍の容量が確保されます。
これらは"len(), cap()"で確認できます。

func main() {
    n := make(int35//要素数, 容量
    fmt.Printf("n len=%d cap=%d value=%d\n"len(n), cap(n), n)
    n = append(n, 12)
    fmt.Printf("n len=%d cap=%d value=%d\n"len(n), cap(n), n)
    n = append(n, -1, -2) //容量が2倍確保される
    fmt.Printf("n len=%d cap=%d value=%d\n"len(n), cap(n), n)

    var a = make([]int3)
    fmt.Printf("a len=%d cap=%d value=%d\n"len(a), cap(a), a)
}

↓実行結果

f:id:theta04:20200803222742p:plain

 

それでは!

ブール変数 ・演算子 / 型変換【夏休みにGo vol.7】

こんにちは、しーたです。
論理回路やゲームでおなじみのブール変数(論理値変数)、忘れてエラー出しがちな型変換について学んでいきます。

 

 

①ブール変数・ブール演算子

・%vは値を返すのに対し、%tはtrueかfalseかを返します。※つまり、ブール型以外の変数に%tを使うとエラーが出ます。

・"&&"が論理積、"||"が論理和、"!"が否定です。ほかの言語と同じですね。

func main() {
    tf := truefalse
    fmt.Printf("%T %v %t\n", t, t, t)
    fmt.Printf("%T %v %t\n", f, f, f)

    fmt.Println(true && true//論理積
    fmt.Println(true && false)
    fmt.Println(false && false)

    fmt.Println(true || true//論理和
    fmt.Println(true || false)
    fmt.Println(false || false)

    fmt.Println(!true//否定
    fmt.Println(!false)
}

↓出力結果

f:id:theta04:20200802015342p:plain

少し前に論理回路の試験があり、01をイヤになるくらい書いたので目に毒です...

 

②型変換(数値→数値)

数値から数値の場合は簡単です。以下のように変換できます。

func main() {
    var x int = 1
    xx := float64(x) //int->float64
    fmt.Printf("%T %v %f", xx, xx, xx)
}

↓出力結果

f:id:theta04:20200802020251p:plain

 

③型変換(文字列→数値)

こちらの方がよく使うと思います。

・"strconv.Atoi()"は変換結果とエラーの2つの戻り値を持っています。エラーの有無は今回使わず、"i, err = str~~" としてしまうと変数不使用のエラーが出てしまうため"_"を書いています。※この変数は使いません、という意味です

・「数値→文字列」の場合は"strconv.Itoa()"を使います。

・"string(h[0])"とするとアスキーコードを文字列に変換することができます。

func main() {
    var s string = "14"
    i_ := strconv.Atoi(s) //str->int(number)
    fmt.Printf("%T %v\n", i, i)

    h := "Hello, World"
    fmt.Println(string(h[0]))
}

↓出力結果

f:id:theta04:20200802020708p:plain

戻り値2つ返せるのは便利でいいですね。Cは1つしかダメだからポインター使ってしたような。

以上です!

それでは!

 

文字列型 / 改行・バッククォート【夏休みにGo vol.6】

こんにちは、しーたです。

数値型に引き続き、文字列型について学んでいきます。

 

①文字列型

・s[0] とすることで、sの一文字目のアスキーコードを出力することができます。
アスキーコード表 → http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html

・strings.Replaceの部分は、sの中にあるHを、1つ目までXに置き換える、という意味です。

・strings/Containsの部分は、sの中にWorldという文字列が含まれていればtrueを返します。

package main

import (
    "fmt"
    "strings"
)

func main() {
    var s string = "Hello, World"
    fmt.Println(s)
    fmt.Println(s[0])

    s = strings.Replace(s, "H""X"1)
    fmt.Println(s)
    fmt.Println(strings.Contains(s, "World"))
}

↓実行結果

f:id:theta04:20200802013006p:plain

 

②改行・バッククォート

・改行は\nを使うほかに``を使う方法があります。``で囲んだ部分はソースコード上の改行が出力にも反映されます。

・また特殊文字であるダブルクォートを出力する際には、\"とする方法、`"`とする方法があります。

※「'」シングルクォートではなく、「`」バッククォートです。気を付けましょう。

func main() {
    fmt.Println("TEST\nTEST===")
    fmt.Println(`add
    plus       test
    test`)
    
    fmt.Println("\"")
    fmt.Println(`"`)
}

↓出力結果

f:id:theta04:20200802014402p:plain


以上です!

それでは!

数値型と演算子 / シフト演算子【夏休みにGo vol.5】

こんにちは、しーたです。
今日はデータ型の種類と演算子について学びます。といっても他の言語とほとんど同じなので例と結果だけで、説明は省きます。

 

 

①数値型と演算子

uint, int, float, complexなど色んなデータ型があります。
演算子もおなじみの+,-,*,/,%、インクリメントも他の言語と同じですね。詳しくはドキュメントの数値型の仕様を見ましょう。→ https://golang.org/ref/spec#Numeric_types

"fmt.Printf"は、%Tでデータ型、%vで値が見れます。

package main

import "fmt"

func main() {
    var (
        u8  uint8     = 255
        i8  int8      = 127
        f32 float32   = 0.2
        c64 complex64 = -5 + 12i
    )

    fmt.Println(u8, i8, f32, c64)
    fmt.Printf("type=%T, value=%v", u8, u8)

    fmt.Println("5+2 = "5+2)
    fmt.Println("5-2 = "5-2)
    fmt.Println("5*2 = "5*2)
    fmt.Println("5/2 = "5/2)
    fmt.Println("5%2 = "5%2)

    x := 1
    fmt.Println("x = ", x)
    x += 2
    fmt.Println("x = ", x)
    x++
    fmt.Println("x = ", x)
}


f:id:theta04:20200801215600p:plain

複素数が簡単に使えるのは嬉しいですね。Cでは使えないのに...と思っていたら使えるようになってるみたいですね。知りませんでした。

 

②シフト演算子 "<<"

シフト演算子はビット演算子の一つです。私は初めて見たので少し書きます。

"<<1"と書くことで、「ビットを左に1つずらす」ことができます。
例えば1という数字は4bitで表すと"0001"です。これが"0010"(=2)になります。(ずらして空いた場所(右端のbit)には0が格納されます)

同様に"1<<2"なら"0001"→"0100"(=4)に、"3<<2"なら"0011"→"1100"(=12)になります。

func main() {
    fmt.Println(1 << 0//0001 = 1
    fmt.Println(1 << 1//0010 = 2
    fmt.Println(1 << 2//0100 = 4
    fmt.Println(1 << 3//1000 = 8
}

 

f:id:theta04:20200801220939p:plain

 


それでは!

 

ライブラリのインポート / 変数の宣言 / constでの宣言【夏休みにGo vol.4】

こんにちは、しーたです。

前回に引き続き、Goの基本を学んでいきます。

 

①ライブラリのインポート

前回登場したfmtの他に、os/user, timeを使ってユーザー名と現在時刻を表示してみます。os/userというのはosライブラリ内にあるuserライブラリのことです。

・パッケージを複数インポートする際は()で囲います。

package main

import (
    "fmt"
    "os/user"
    "time"
)

func main() {
    fmt.Println("Hell, world.", time.Now())
    fmt.Println(user.Current())
}

※実行結果に私の実名が出てしまったので、今回は見せません。

↓標準のライブラリについてはこちらで説明が見れるので困ったときは見てみましょう。
https://golang.org/pkg/

 

②変数宣言

Goでは以下のように変数を宣言します。t,fのように同じ型なら並べて宣言することもできます。

package main

import "fmt"

func main() {
    var i int = 0
    var f64 float64 = 1.2
    var s string = "test"
    var tf bool = truefalse
    fmt.Println(i, f64, s, t, f)
}

↓実行結果

f:id:theta04:20200801140742p:plain
また、↓のようにvarを()でまとめることも可能です。

func main() {
    var (
        i    int     = 0
        f64  float64 = 1.2
        s    string  = "test"
        tf bool    = truefalse
    )

    fmt.Println(i, f64, s, t, f)
}

他にも↓のように型を省略して宣言することも可能です

xi := 1

この場合、特に数値は int, float32bit / 64bitなどから自動で割り当てられる(?)ので、指定したい場合は型をしっかりと記述するほうが良いです。
※"fmt.printf("%T", 変数名)" で変数の型を見ることができます。

func main() {
    f := 1.2
    var f32 float32 = 1.2
    fmt.Printf("%T, %T", f, f32)
}


f:id:theta04:20200801142141p:plain

・関数内で宣言すればローカル関数に、関数外で宣言すればグローバル関数になります。

package main

import "fmt"

var (
    i    int     = 0
    f64  float64 = 1.2
    s    string  = "test"
    tf bool    = truefalse
)

func main() {
    fmt.Println(i, f64, s, t, f)
}

※Goでは同じ変数の宣言を2回するとエラーがでます。他の言語だとエラーにならないことも多いかも? 不慮の事故を防止するための仕様だそうです。

 

③constでの定数宣言 

定数の場合は、↓のように型を指定せずに宣言することもできます。この場合、複数の型に代入することができる不思議な形になります。

const Pi = 3.14
 
var a float32 = Pi
var b float64 = Pi

定数で宣言した変数に値を代入することはできません。(エラーがでます) 

 

以上です!GoがCに似ている、っていうのが何となく分かってきました!
それでは!

Hello, World / init関数 / コメントアウト【夏休みにGo vol.3】

こんにちは、しーたです。

前回、開発環境の構築をしたので早速プログラミングに入っていきたいと思います!

 ①Hello, World (+関数定義)

プログラミング入門の定番、Hello, Worldです。(同時進行でbuzzという名前の関数を定義、実行もしています)

package main

import "fmt"
 
func bazz() {
    fmt.Println("Bazz")
}
 
func main() {
    bazz()
    fmt.Println("Hell, world.""TEST TEST")
}
VScodeだと、F5キーで実行できます。
↓実行結果

f:id:theta04:20200801132747p:plain

package mainの意味はまだあまり分かっていません。今はおまじないだと思っています。
※理解すれば書き足すかもです。
import packageでfmtというパッケージを読み込み、その中のPrintlnを実行しています。
このPrintlnのPの大文字・小文字に区別があるようですが、まだ理解していないので追って説明します。
 

②init関数

initという名前の関数に書いた内容は、main関数で呼び出さなくても最初に実行されます。初期設定などに使うようです。

package main

import "fmt"

func init() {
    fmt.Println("Init!")
}

func bazz() {
    fmt.Println("Bazz")
}

func main() {
    bazz()
    fmt.Println("Hell, world.""TEST TEST")
}

↓実行結果

f:id:theta04:20200801133645p:plain

コメントアウト

一行のコメントアウト → //コメント
複数行のコメントアウト → /*コメント(複数行可)*/

でできます。

package main

import "fmt"

func init() {
    fmt.Println("Init!")
}

/*
func bazz() {
    fmt.Println("Bazz")
}
*/

func main() {
    //bazz()
    fmt.Println("Hell, world.""TEST TEST")
}
↓実行結果

f:id:theta04:20200801133903p:plain

 
以上です!それでは!

環境構築【夏休みにGo vol.2】

こんにちは、しーたです。

まずはGo言語の環境構築をしていきます。

 

 

 ①Goのインストール

公式のダウンロードページからwindows最新版をダウンロード、すべてデフォルトの設定でインストールします。
https://golang.org/dl/

コマンドプロンプトの適当な場所(ディレクトリどこでもいいという意味)で
">go"を実行して、ヘルプが出てきたらOKです。

f:id:theta04:20200801023010p:plain

 ②gitのインストール

Goのライブラリをダウンロードするのにはgitを使うので、今のうちにgitをインストールしておきます。

Goと同じく公式のダウンロードページからダウンロードして、すべてデフォルトでインストールします。
https://git-scm.com/download/win

コマンドプロンプトの適当な場所で
">git"を実行して、ヘルプが出てきたらOKです。

f:id:theta04:20200801024340p:plain

 ③godocのインストール

godocはGo言語のドキュメント化ツールらしいです。(この意味はまだ理解していません)
コマンドプロンプトで">go get golang.org/x/tools/cmd/godoc"を実行します。

f:id:theta04:20200801025313p:plain

↑このURLは↓の上の方に書いてあるものです。

f:id:theta04:20200801025249p:plain

↓より詳しい方法はこの記事がとても分かりやすいです。
https://qiita.com/spiegel-im-spiegel/items/5f9e96f226f46089388f

インストール終了後、コマンドプロンプトで">godoc -http=3000"を実行します。
※ファイアーウォールの警告がでましたが、私は「許可」を押しました。

f:id:theta04:20200801030319p:plain

その後"http://localhost:3000/"にアクセスして、Goのドキュメントが表示されればOKです。

f:id:theta04:20200801030507p:plain

 

 ④IDE(統合開発環境)のインストール

GoLandというIDEが使いやすいらしいですが、30日の無料期間後は有料になるみたいなので、私はVisual Studio Codeを使います。
Visual Studio Codeのインストール
https://azure.microsoft.com/ja-jp/products/visual-studio-code/

GoLang
https://www.jetbrains.com/ja-jp/go/

 

 ⑤VScodeにGoの拡張機能をインストール

↓こちらの記事がとても分かりやすいので、説明は割愛します。
https://qiita.com/melty_go/items/c977ba594efcffc8b567

 

以上、無事Goの開発環境が準備できました。
次回から本格的に学んでいきます!

それでは!