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 )