Go Lunch はじめました。
社内でGoの機運が高まってきたので、GoLangをもくもくとやる、GoLunchを毎週金曜日のランチタイムに集まってやることにしました。
第1回目は、9名の参加。 以下の書籍をみんなで買って、それぞれが好きなスピードで進めていくようにしてます。かなりゆるいです。
- 作者: 松尾愛賀
- 出版社/メーカー: 翔泳社
- 発売日: 2016/05/11
- メディア: Kindle版
- この商品を含むブログを見る
mac book airで環境構築。 Goのインストールから。バージョン変わった時にさくっと変えたいので、anyenvから、goenvをインストールしたのち、
# goenv install 1.6 # goenv global 1.6 # goenv rehash # go version go version go1.6 darwin/amd64
無事入りました。 anyenvのインストール方法や使い方は以下のリンクで。
頭のなかでgo buildができると豪語している @pyama 氏がvim-goが便利だという情報を聞きつけ、以下を参考にいれてみました。
加えて、.vimrc
に goimports
を自動でやってくれるように設定します。
$ vi ~/.vimrc let g:go_fmt_command = "goimports"
以下のようなコードを書いてみます。fmtがインポートされてないので、当然エラーになります。
package main func main() { fmt.Println("Hello Golang") }
が、vim-go入っていると、以下の通りファイルを保存する際に、自動で足りないパッケージをimportしてくれます!
すごい!
スターティングGO言語本までいきつかずに本日はここまで。
アトミックとは
ある操作に対して、他者が割り込めないこと。
アトミックにするには、ロック操作が必要であるが、OSの機能によってはアトミックが保障されておりロック操作不要なものもある。
C言語: NULLポイント
ポインタ変数は宣言直後はでたらめな値が格納されているので、このまま利用するのはバグとなり危険。
これを防ぐために、アドレスを代入したかどうかを区別する必要がある。
NULL
をポインタ変数に代入しておくことで、区別をつけることができる。
- 書き方
int *p = NULL;
- サンプル
1 #include <stdio.h> 2 3 int main(void) 4 { 5 int *p = NULL; 6 if (! p) { 7 printf("p = Null\n"); 8 } 9 int i; 10 p = &i; 11 if (p) { 12 printf("p = Not null\n"); 13 printf("p = %p\n", p); 14 } 15 return 0; 16 }
- 実行結果
# ./a.out p = Null p = Not null &i = 0x7fff5690b83c
C言語: ポインタ、事はじめ
ポインタ型
アドレスを記憶する変数の型。 他の型と合体して型を生成する。
ポインタ値
変数のアドレスの値のこと。
ポインタ変数の宣言
int *p; int* p;
どちらも同じ。
int* p1, p2;
と書いた場合、p2
はint型になる。そのため、変数の前に*
をつけて明示してあげたほうが良さそう。
アドレスを代入
#include <stdio.h> int main(void) { int *p, i; p = &i; printf("p = %p\n", p); printf("&i = %p\n", &i); return 0; }
上記をコンパイルして実行すると以下の通りとなる。
# ./a.out p = 0x7fff535df83c &i = 0x7fff535df83c
C言語: メモリーのアドレスを知る。
変数が格納されている、メモリ上のアドレスを知るには printf
に %p
で表示できる。
変数には、&
をつける。配列のアドレスを知りたい場合は、&
は不要。
#include <stdio.h> int main(void) { int i1, i2, i3; printf("i1(%p)\n", &i1); printf("i2(%p)\n", &i2); printf("i3(%p)\n", &i3); int array[10]; printf("array___(%p)\n", array); printf("array[0](%p)\n", &array[0]); printf("array[1](%p)\n", &array[1]); printf("array[2](%p)\n", &array[2]); return 0; }
コンパイル後、実行結果。
# ./a.out i1(0x7fff510de818) i2(0x7fff510de814) i3(0x7fff510de810) array___(0x7fff510de820) array[0](0x7fff510de820) array[1](0x7fff510de824) array[2](0x7fff510de828)
10進数にすると、4バイトで区切られていることがわかる。 これは、int型が4バイトであるため。
C言語のプロトタイプ宣言
自作関数を作成する。 sum
関数を作成する。
#include<stdio.h> int main(void) { sum(); /* sum関数を呼び出す */ return 0; } int sum(void) { printf("%d\n", (1 + 100) * 100 /2); return 0; }
これをコンパイルしてみると以下のようなエラー。
sample2.c:6:5: warning: implicit declaration of function 'sum' is invalid in C99 [-Wimplicit-function-declaration] sum(); /* sum関数を呼び出す */ ^ 1 warning generated.
sum
関数がmain
より後ろに記述されているため、エラーとなった。このエラーを解決するには、最初にこの関数が存在することを明記する必要がある。
以下の通り記述する。
#include<stdio.h> int sum(void); /* プロトタイプ宣言 */ int main(void) { sum(); /* sum関数を呼び出す */ return 0; } int sum(void) { printf("%d\n", (1 + 100) * 100 /2); return 0; }
そして、コンパイルすると成功した。