学習ノート 名前: Dozi0116

プログラムのことか、ゲームのことか、サイト作ったらそっちに移転したい

Go言語の違うところ

目的

c言語Pythonはわかっているから、その知識を流用しながらGo言語に入門したい! ということで、「超基本的な部分はxxxと同じ、ここだけ違うから注意!」のような感じで『改訂2版 基礎からわかるGo言語』をかいつまんでみる

という名目の11/07勉強ログ


はじめのコード

package main

import "fmt"

func main() {
    var a, b, c int = 123, 456
    var d = true | false
    fmt.Println("Hello, World!")
    fmt.Println(a+b, c, d)
}
  • 実行時に呼び出される関数はmainパッケージのmain関数
  • 必要なモジュールは import する
  • 関数宣言は func name() {}
    • このとき、開カッコは func name() と同じ行にないとCE
  • セミコロンはなし
  • 変数宣言は var name[, name2, ...] type [= initalize] で行う。
    • ない場合は勝手にゼロ値(空文字とか0とかfalseとか)で初期化
    • 初期化する場合は型を省略可能
  • 真偽値はtrue, false

実行するには

コンパイル

go build source.go

gccと同じように書くことができる、 -o オプションも同じ。

コンパイルファイルいらないよって場合は、

go run source.go

コンパイル+実行してくれ、コンパイルファイルは残らない。

string型の文字数取得

pythonのようにlen関数が用意されているが、バイト文字列として認識するため、日本語は正常にカウントできない。 → unicode/utf8 パッケージにあるRuneCountInStringを使えばOK

型を宣言する

cでいうtypedefと同じようなもの。

type ll int64

type point2D struct {
    x float64
    y float64
}

型変換

Pythonのような型推論はほぼないし、Cのような暗黙な型変換もない。 ちゃんと

var a int = 1
var b float64 = float64(a)

のように明示的に行ってあげる。

Cのように、string = string(int) のようになる場合、文字列になるのではなく、数値が指し示すUnicode文字になる

演算子

算術演算子

ほぼほぼC準拠。

var a int = 10
var b int = 20
b /= a         /* 2 */

var c int = 7 &^ 3      // 111 &^ 011 = 100

var c string = "abc"
var d string = "def"
d += c       // "defabc

ビットクリア演算子(`&^ = and not)だけ目新しい感じ。 演算は文字列の足し算などもできるが、文字列の掛け算はできない、リストに対しては演算ができないなどPythonにはかなわない

比較演算子

C言語と形は同じ、文字(文字列)の辞書順比較もOK。 配列や構造体は比較できない。

インクリメント&デクリメント

var i int = 10
i++ // OK
var j int = i++ // CE
++i // CE

インクリメント・デクリメントと同じ行に他の演算を書くことができない 後置インクリメント・デクリメントのみできる

代入

Pythonのように,で区切った複数代入が可能。

変数宣言

Cっぽくも、Pythonっぽくもかける

package main
import "fmt"

func main() {
    var num1 int // 一番基本的
    var num2 int = 123 // 初期化できる
    var num3 = 123 // 初期化するなら型省略可能
    var num4, num5 int // まとめて宣言もできる
    num6 := 123 // はじめに入れる型に応じて型をキメてくれる
    const num7 = 123 // 定数
}

リテラル

2進数以外何でもかけるようなイメージ

a := true | false // 全部小文字
b := 0123 & 0xabc
c := 1 + 2i // Pythonと違って虚数はiを使う
d := 'A' // バイトコードが入る(型はint? byte?)
e := "A" // 文字列になる(型はstring)
f := `複数行・非エスケープ文字列`

iota列挙子

Cのenumっぽいもの、0オリジン(変更可能)で1ずつ増えて(変更可能)いく列挙体

const(
    hoge = iota // 0
    fuga  // 1
    foo // 2
    bar // 3
)

const(
    a = 1 + iota // 1から始まる
    b  // 2
)