私は Go が初めてで、(FAQ から) Go はオブジェクト指向であり、そうでないことを読みました。Structs を使用してデータ構造を作成したいのですが、Structs を単純なオブジェクトとして考えようとしています。私の標準的な概念実証は、車を構築することです。車は現実世界のオブジェクトであることを理解しているので、OOP に向いていますが、これは Go では奇妙かもしれません。しかし、User クラスも同じように便利だと思うので、これは私にとって有益な学習演習とリファレンスになるでしょう。
この例はコンパイルされますが、正しく機能しません。複数のソース ファイルを使用するため、GOPATH を操作して、このためのプロジェクト フォルダーを作成する必要があります。
次のようになります。
$GOPATH/src/car/car.go
$GOPATH/src/car/parts/engine.go
またはそれを見る別の方法:
$ cd /tmp/go/src
$ tree
.
└── car
├── car.go
└── parts
└── engine.go
Main は car インスタンスに以下の .Start() を要求します。メインに戻ると、車は始動しません。
/* car/car.go */
package main
import (
"car/parts"
"fmt"
)
type Car struct {
sMake string
model string
engine parts.Engine
}
func init() { // optional init of package
// note that we can't use this as a constructor?
}
func main() {
car := Car{
sMake: "AMC",
model: "Gremlin",
}
fmt.Printf("I'm going to work now in my %s %s\n", car.sMake, car.model)
fmt.Println("I guess I should start my car.")
car.Start()
fmt.Println("Engine started?", car.engine.IsStarted())
// fail -- engine started is false :(
}
func (car Car) Start() {
fmt.Println("starting engine ...")
car.engine.Start()
fmt.Println("you'd think it would be started here ...", car.engine)
// but it's not
}
ソースファイルを分割すると便利です。これはすべて機能します
/* car/parts/engine.go */
package parts
import (
"fmt"
)
type Engine struct {
cylinders int
started bool
}
func (engine Engine) Start() {
fmt.Println("Inside the Start() func, started starts off", engine.started)
engine.started = true
fmt.Println("Inside the Start() func, then turns to", engine.started)
// this is a sanity check
}
func (engine Engine) IsStarted() bool {
return engine.started
}
これを実行すると、次のように出力されます。
$ go run car.go
I'm going to work now in my AMC Gremlin I guess I should start my car. starting engine ... Inside the Start() func, started starts off false Inside the Start() func, then turns to true you'd think it would be started here ... {0 true} Engine started? false
構造体で関数を呼び出すことは理にかなっていますが、内部状態を間違った方法で操作しようとしているのだろうか? または、スコープを理解していない可能性があります。誰かがこれを通して私を助けることができれば、私は参考のためにそれを大いに評価します.
また、誰かが初期化子の優先または慣用的な方法を持っている場合。たとえば、エンジンはデフォルトで 4 気筒に設定されている場合があります。