goで、関数名は大文字で始まらなければ、外部パッケージの関数は呼び出せない | www.yoshiislandblog.net

goで、関数名は大文字で始まらなければ、外部パッケージの関数は呼び出せない

結構ハマったのでメモ。
goで、関数名は大文字で始まらなければ、外部パッケージの関数は呼び出せない。

例えば以下のような構造のファイルがあるとする。
main-package.go内で、sub-package.go内の関数を呼び出したい。

% tree
.
├── main-package.go
└── packages
    └── sub-package.go

1 directory, 2 files

sub-packageの中身は以下の通り。
大文字で始まるHellohello()は呼び出せるが、小文字で始まるhellohello()は呼び出せないことを確認する。

% cat packages/sub-package.go
package hogehoge

import (
)

func Hellohello() string {
  line := "Hello hello"
  return line
}

func hellohello() string {
  line := "hello hello"
  return line
}

まずは、大文字で始まるHellohello()をお呼び出し。

% cat main-package.go
package main

import (
  "fmt"
  "./packages"
)

func main() {
  line := hogehoge.Hellohello()
  fmt.Println(line)

}

正常に実行できる。

% go run main-package.go
Hello hello

次に、小文字で始まるhellohello()をお呼び出し。

% cat main-package.go
package main

import (
  "fmt"
  "./packages"
)

func main() {
  line := hogehoge.hellohello()
  fmt.Println(line)

}

参照できないと怒られる。。。

% go run main-package.go
# command-line-arguments
./main-package.go:9:11: cannot refer to unexported name hogehoge.hellohello
./main-package.go:9:11: undefined: hogehoge.hellohello

以上

%d bloggers like this: