goのお勉強1
スコープ
変数や関数名で1文字目が小文字だとパッケージ内からのみ見える。大文字だとパッケージ外からのみ見える。
ポインタ
ポインタは、C言語と同様に利用できる。
package main import "fmt" func main() { a := 5 var pa *int = &a // *intはint型のpointer fmt.Println(pa) // アドレスが表示される fmt.Println(*pa) // 値(5)が表示される *pa = 10 fmt.Println(a) // 10が表示される }
ただし、C言語と違いポインタは演算は出来ない。 c言語だと配列とかはポインタで表現され、以下のようにできるがgoでは出来ないことを確認する。 C言語では以下のように記述できる。
#include <stdio.h> int main() { int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int* p = array; /* 配列の全要素の値を表示する */ for (int i = 0; i < 10; ++i) { printf("*p = %d\n", *p); p = p + 1; /* ポインタの値を 1 増やす */ } return 0; }
goで同じような処理をしようとしてみるとinvalid operationとコンパイルエラーになる。
スライスにしても同様にコンパイルエラーになる。
package main import "fmt" func main() { arr := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} var p *[10]int = &arr for i := 0; i < 10; i++ { fmt.Println(*p) // [1 2 3 4 5 6 7 8 9 10]が出力される // fmt.Println(p[i]) とすると配列のi番目の値を出力できる p = p + 1 // invalid operation: p + 1 (mismatched types *[10]int and int) となりコンパイルエラーになる。 } }