エンジニアもどきの雑記

メモ帳です。きっと。macアプリ配信windowsでもできるようになるまで絶対にメイン機にしないマン。特筆しない限り環境は【win10home,i5-7200u,8g,64bit,巨乳が好き】

GoLangやるpart1

仕事じゃなくて趣味で少しずつ書いてたんだけど
改めて最初っからこうやって記事にアプトプットしていくことにした。

環境はwsl
エディタはvim 8.0
vim-goとかはとりあえずセッティングしてある。
けどまだ使いこなせてない
でもこれだけは言える。
入れておいて、不便はない

一例
f:id:dddpga1:20180503015912g:plain

[(゜-゜):daichi]@:Daichi$ go version
go version go1.10 linux/amd64


インストールとかは公式を見るか記事を探せばいくらでもあるのでそっちで。

基礎を一から、ってのが目標。
c#?いつかまた再開する。記事にするのもそれはそれは大変なのだ。(言い訳


Hello world

まぁまずはここからだよね

main.go

package main

import (
    "fmt"
)

func main() {
     fmt.Println("Hello world!")
}


とりあえず実行

[(゜-゜):daichi]@:sample$ go run main.go
Hello world!



うん。

goは知っての通り、コンパイル言語だけど、
go runコマンドはビルドプロセスを隠蔽しつつ実行できる
コマンドらしい。
テストで実行する時に使用するもの、って感じなのかな。


じゃあ一個ずつ見てく。

package main
goのすべての要素は何かしらのパッケージに属する。
そして、一つのファイルは一つのpacakgeにしか属せない。
なので

package main
package hoge


のようなことをするとコンパイルエラーになる。
なるよね?

テスト
先ほどのmain.goにpackage hogeを追加。

[(゜-゜):daichi]@:sample$ go run main.go
# command-line-arguments
./main.go:2:1: syntax error: non-declaration statement outside function body

とりあえず実行できなかった。よし。

main.goはmain packageに属している。
とりあえずそれはわかる。



続いて

import (
    "fmt"
)


ファイル内(今回ではmain.go)の中で利用するパッケージを宣言する。
書き方は複数あるし、使わない時は省略が可能。
でも大体書いてる内に複数使うから自分は最初からこの形で書いちゃう

使わないpackageを書きっぱなしにしておくと
これまたコンパイルエラーになる

以下の方法で無理やり入れることはできる

import (
    _ "fmt"
)


が、これは参照されていないパッケージをファイルに組み込むためのもの。
フレームワークとか公式じゃないパッケージとか使うと使う機会が増える気がする。
echoで最近だと使った気がする。


で、次。

func main() {
    fmt.Println("Hello world!")
}


まずgoのエントリーポイント(どこからプログラミングが実行されるか)が
main packageのmain関数から。とのこと。
つまり、今後このファイルを拡張してどんどん他のファイルをimportして動かしていっても、
まず動くのはここから。

main関数の中はImportしているfmt packageのPrintlnという関数を使ってHello world!
を表示させている。

以上。
fmtはgo langに最初から含まれてる標準package
一覧はこちら

ほんとに沢山のpackageが最初からあって正直覚えてられない。
ひたすら書くしかない。頑張ろう。


じゃあせっかくなのでコンパイルまでしてみる。

go build -o hello main.go
buildはgo buildコマンド
-oオプションを付けることでビルド後の名前を指定できる。今回はhello

そして以下

[(゜-゜):daichi]@:sample$ ls
hello  main.go


実行

[(゜-゜):daichi]@:sample$ ./hello
Hello world!


windows上の時はexeファイルで。

容量とかを見てみる

-rwxrwxrwx 1 daichi daichi 2025142 May  3 02:23 hello*
-rw-rw-rw- 1 daichi daichi      78 May  3 02:06 main.go


でけぇ。
何故でかいのか


readelf -s hello

~~~
  3064: 000000000047bc70   118 FUNC    GLOBAL DEFAULT    1 fmt.(*fmt).fmt_bx
  3065: 000000000047bcf0   483 FUNC    GLOBAL DEFAULT    1 fmt.(*fmt).fmt_q
  3066: 000000000047bee0   176 FUNC    GLOBAL DEFAULT    1 fmt.(*fmt).fmt_c
  3067: 000000000047bf90   242 FUNC    GLOBAL DEFAULT    1 fmt.(*fmt).fmt_qc
  3068: 000000000047c090  2196 FUNC    GLOBAL DEFAULT    1 fmt.(*fmt).fmt_float
  3069: 000000000047c930   499 FUNC    GLOBAL DEFAULT    1 fmt.(*buffer).WriteRune
  3070: 000000000047cb30   180 FUNC    GLOBAL DEFAULT    1 fmt.newPrinter
  3071: 000000000047cbf0   190 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).free
  3072: 000000000047ccb0    23 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).Width
  3073: 000000000047ccd0    23 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).Precision
  3074: 000000000047ccf0   147 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).Flag
  3075: 000000000047cd90   299 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).Write
  3076: 000000000047cec0   242 FUNC    GLOBAL DEFAULT    1 fmt.Fprintln
  3077: 000000000047cfc0   137 FUNC    GLOBAL DEFAULT    1 fmt.Println
  3078: 000000000047d050   263 FUNC    GLOBAL DEFAULT    1 fmt.getField
  3079: 000000000047d160   811 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).unknownType
  3080: 000000000047d490  1726 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).badVerb
  3081: 000000000047db50   109 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).fmtBool
  3082: 000000000047dbc0   141 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).fmt0x64
  3083: 000000000047dc50   780 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).fmtInteger
  3084: 000000000047df60   383 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).fmtFloat
  3085: 000000000047e0e0   566 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).fmtComplex
  3086: 000000000047e320   422 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).fmtString
  3087: 000000000047e4d0  2260 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).fmtBytes
  3088: 000000000047edb0  1413 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).fmtPointer
  3089: 000000000047f340  1050 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).catchPanic
  3090: 000000000047f760  1197 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).handleMethods
  3091: 000000000047fc10  2412 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).printArg
  3092: 0000000000480580 10099 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).printValue
  3093: 0000000000482d00   456 FUNC    GLOBAL DEFAULT    1 fmt.(*pp).doPrintln
  3094: 0000000000482ed0    84 FUNC    GLOBAL DEFAULT    1 fmt.glob..func1
  3095: 0000000000482f30   279 FUNC    GLOBAL DEFAULT    1 fmt.init
  3096: 0000000000483050   126 FUNC    GLOBAL DEFAULT    1 type..hash.fmt.fmt
  3097: 00000000004830d0   172 FUNC    GLOBAL DEFAULT    1 type..eq.fmt.fmt
  3098: 0000000000483180   110 FUNC    GLOBAL DEFAULT    1 main.main
  3099: 00000000004831f0    91 FUNC    GLOBAL DEFAULT    1 main.init
~~~


どうやらbuildした時にfmtパッケージ等必要なものを丸々入れてくれてるらしい。
今回まだ書いてないけど、クロスプラットフォームの容易な実現とかはここら辺で
うまくしてくれてるんだと思う。


今日は以上。
とりあえずhello worldでした

自分が持ってる各種参考書等を参考にしてます。

基礎から少しずつ進んでこう。


また次回。

次回
dddpga1.hateblo.jp