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) となりコンパイルエラーになる。
  }
}