m_shige1979のときどきITブログ

プログラムの勉強をしながら学習したことや経験したことをぼそぼそと書いていきます

Github(変なおっさんの顔でるので気をつけてね)

https://github.com/mshige1979

go言語の学習メモ9(ファイルを分割)

includeとかrequireとか

です。
外部に定義ファイルなどを持たせて分割して記載したいけどなんかあんまりなかったので調査
goでの外部のgoファイルをどのようにして読み込むかなどを
packageとかimportとかを駆使して対応するようです

packageという名前

1つなのはmainのみであとでディレクトリ単位でグルーピングできるみたい
完全にユニークというわけではなさそうです。

ディレクトリ構造

$ tree
.
├── car
│   └── car1.go
└── sample1.go

1 directory, 2 files
$ 

ファイル

car/car.go
package car

import (
	"fmt"
)

type MyString string

func Msg(name string){
	fmt.Println(name)
}

type Car struct{
	Name string
	Weight int
}

func (obj *Car) Init(){
	obj.Name = "car"
	obj.Weight = 1500
}

func (obj *Car) Message() {
	fmt.Println(obj.Name, obj.Weight)
}

※外部に公開する場合はメソッド名などは先頭の1文字は大文字にする必要が有るようです

sample1.go
package main

import (
	"./car"
	"fmt"
)

func main(){
	fmt.Println("--- start ---")

	// とりあえず
	var message car.MyString = "aaaaa"
	fmt.Println(message)
	car.Msg("test")

	// struct構造体の変数に設定
	var obj1 car.Car
	obj1.Name = "1111"
	obj1.Weight = 1200
	fmt.Println(obj1.Name, obj1.Weight)

	// メソッドを使用
	var obj2 car.Car
	obj2.Init()
	obj2.Message()

	fmt.Println("--- end ---")
}

※直下のパッケージを読み込む場合は"./パッケージ名"とする必要があるよう

$ go run sample1.go 
--- start ---
aaaaa
test
1111 1200
car 1500
--- end ---
$ 

※動作しました

もう1つファイルを追加

car/car2.go
package car

import (
	"fmt"
)

func Message2(){
	test1()
	fmt.Println("package car2")
	test2()
}

func test1(){
	fmt.Println(" --- start --- ")
}

func test2(){
	fmt.Println(" ---  end  --- ")
}

※小文字の場合は内部で呼び出すことなら可能

sample2.go
package main

import (
	"./car"
	"fmt"
)

func main(){
	fmt.Println("--- start ---")

	// メソッドを使用
	var obj2 car.Car
	obj2.Init()
	obj2.Message()

	// car2.go
	car.Message2()

	fmt.Println("--- end ---")
}

$ go run sample2.go 
--- start ---
car 1500
 --- start --- 
package car2
 ---  end  --- 
--- end ---
[vagrant@localhost app3]$

所感

あんまりサンプルないので見つけるのに苦労しています。
いろいろなソースをみてから勉強していくしかなさそう。
普段使用しないポインタがあるのでちょっと苦労するかもしれません