Go言語は徹底した組み合わせ向けの同時言語である

4483 ワード

AOPのMixinからRubyのTraitsまでを組み合わせてプログラミングし、DCI設計までScalaのtraitを含む組み合わせ設計まで、これらには共通の特徴があり、組み合わせ特性は明示的であり、つまり組み合わせを専門的な文法で宣言する.実はコンビネーションデザインはオブジェクト向けのデザインの中で自然な方法であるべきで、つまり、オブジェクト向けの言語を使う限り、traitなどの文法で専門的に実現する必要がなく、暗黙的に強力なコンビネーション能力を備えています.Less is Exponentially Moreによると、If C++and Java are about type hierarchies and the taxonomy of types,Go is about composition.C++とJavaがタイプに関する階層と分類である場合、Goは組合せについてです.組み合わせて見てみましょう.Go言語は、属性フィールドとメソッドのタイプが完全に平等に定義されていることを明らかにし、それらを組み合わせて、オブジェクトDoorに現在のステータスを識別する属性があると仮定します.2つの方法はオンとオフです.GOコードは次のようになります.
type Door struct {
    opened bool
}
 
func (d *Door) Open() {
    d.opened = true
}
 
func (d *Door) Close() {
    d.opened = false
}

この3つの行コードはそれぞれ1つのstruct(静的構造)と2つの動的機能メソッドOpen()とClose()を定義する.GoではJavaのないClassクラスの概念であるため,静的構造と動的挙動を1つのクラスに混合することはできないが,実際には一般的には両者を分離することが利点である.構造は一般的に不変であり,可変性を有し,混合が必要な場合は基本的に状態可変が必要であるため,GoのCSPモデル(Actorモデルに類似)を用いるとよい.Go言語のこのような動静分離設計は非常に巧みである.
Go言語は継承の代わりに組合せを用いることを提唱しているが,組合せは多態性を実現できるだろうか.継承における多態性は、複数のサブクラスが親を継承することによって実現され、組合せはどのように実現されますか?次に、Go言語の組み合わせの多態性の実現を見てみましょう.
package main

import (
	"log"
)

type B struct{  }
func (b B) foo() {     log.Printf("...") }

type A struct {
    B
}

func main() {
	var a A
	a.foo()
}

以上のコードポイントをhttp://play.golang.org/p/IU7xq62WC-直進運転
foo()はBのメソッドであるが,BがAに埋め込まれている場合,そのメソッドはAのメソッドが直接呼び出されると見なすことができる.これはJavaのA extends Bに似ていますが、つまりAがBを継承しています.Go言語は,Javaの従来言語で継承を用いた多態性を組み合わせて実現している.
上記Aに埋め込まれたBがインタフェースだったらどうしますか?Javaでフィールドがインタフェースの場合、
注入やIOCコンテナに依存してインタフェースの実装サブクラスを注入するのは,我々がコンビネーション方式を用いてよく遭遇するシーンであり,もちろんJavaが
注入に依存して言語メカニズムに参加し、Java 9の事前開示設計からこのような傾向は少しも見られず、Java規範設計に参加している人がJava開発企業アプリケーションをよく使用しているかどうか、JVMベースのScalaの
依存注入も同様である.
Bがインタフェースであると仮定する.
package main

import (
	"log"
)

type B interface {
    foo() 
}

type A struct {
    B
}

func (a A) foo() {     log.Printf("...") }

func main() {
	var a A
	a.foo()
}

http://play.golang.org/p/p3wATT9I2F
我々はAのためにインタフェースBのfoo()を実現する方法は,func(a A)foo()をtype A structに注入するのと似ているかどうか,もちろんここでBはインタフェースであり,a.B.foo()呼び出しは使用できないが,前の例Bはエンティティであり,a.B.foo()を使用できる
Go言語の自然な言語の組み合わせの能力のため、私達は余分な借りをする必要はありません
注入フレームワークに依存して組合せ+注入を実現したのは、おそらく私の初期に最も驚いたことだろう.同時に、いわゆるMixinやtrait機能は自然にこのようなコンポーネント実装に融合しており、例えばAはもともとfoo()を方法とせず、Go言語自体がBのfoo()を編んでweavingをAに入った.
同時
記事に戻ってDoorを例に挙げると、Doorは状態のあるオブジェクトですが、その状態を変える行為を守るのは外に分解され、組み合わせて突き合わせることで、個人的には貧血モデルか失血モデルだと思います.Javaのようなsetter/getter方法のPOJOしかありませんが、私たちは
DDD設計では,リッチモデル集約ルートを用いて実現することを提唱し,集約ルートによって状態を守り,集約ルート間でメッセージを介して
イベント駆動、GoのCSPモデルが実現に役立ちます.
GoのCSPモデルはchannelとgoroutineを使用して並列プログラムを開発する能力であり、協程は緑色のスレッドであり、本当のオペレーティングシステムのスレッドではなく、オペレーティングシステムのスレッドを使用して絶えず切り替えて使用され、Nodeのようなものである.JSのシングルスレッド非同期
同時原理で、この費用はとても小さいです.
同時生産能力比マルチスレッド
同時にもっと経済的になる.JVMでActor、緑のスレッド、CSPを実装することはできません
CSPは以下のコードである.
package main

import "fmt"
import "time"

func sleepAndTalk(secs time.Duration, msg string, c chan string) {
    time.Sleep(secs * time.Second)
    c "Hello", c)
    go sleepAndTalk(1, "Gophers!", c)
    go sleepAndTalk(2, "What's", c)
    go sleepAndTalk(3, "up?", c)

    for i := 0; i < 4; i++ {
        fmt.Printf("%v ", 

http://play.golang.org/p/vIH6o-o-HB
c:=make(chan string)はチャネルを生成し、goはコヒーレンスを識別し、同時に実行する.コラボレーションとchannelの関係はJavaのスレッドとキューに似ています.複数のCSPは、集約ルートとして直列に接続できます.