### K8Sソースコードやスタイル指定
I.プロジェクトの概要
- プロジェクトは主にオープンソースプロジェクトのための拡張のための行動Kubernetesクラスタに基づいています。既存のクラスタとKubernetesプロメテウスの監視システムに基づいて、拡張機能の開発のための要件。
- K8Sは、Googleが開発した、行くと言語の開発を使用しています。
第二に、ソースコードの準備
1.システム環境:
- オペレーティングシステム:私たちはここで、Ubuntuは行います、K8Sソースコード解析およびデバッグ環境、フェドーラ、CentOSのようにLinuxを使用して、私はFedoraのを使用します。
- golang関連:
GOROOT=/usr/local/lib/golang
GOPATH=/root/go
go version go1.10.3 linux/amd64
2.ソースコードをダウンロードしてください
mkdir -p /root/go/src/k8s.io
cd /root/go/src/k8s.io/
git clone https://github.com/kubernetes/kubernetes.git
カタログ表示:
主なカタログ:
ディレクトリ名 | 機能 |
---|---|
CMD | 各コードエントリコンポーネント(メイン関数) |
PKG | 各構成要素の具体的な機能を達成するために |
ステージング | これは、サブライブラリープロジェクトとなっています |
ベンダー | 頼ります |
3.IDE
- 学校教育のアカウントを通じてJetBrainsのメールアプリケーション、Golandでコードを見て:
三つは、言語機能や命名規則を行きます
1.go言語の機能
言語の主要な機能をGO、次の側面が含まれています。
- コルーチンと同時に
- ベースのメッセージパッシング通信
- 豊かで便利な組み込みデータ型
- マルチファンクションの戻り値
- メカニズムを延期
- リフレクション(反映)
- 高性能のHTTPサーバー
- エンジニアリング管理
- プログラミングの仕様
2.関連する規範
パッケージ名
競合しない、意味のある、簡単に意味のあるパッケージ名を取るしようと、一貫性のあるパッケージ名とディレクトリを維持し、可能な限り標準ライブラリにします。インポート仕様
のインポート複数行の場合には、自動化ツールが自動的にフォーマットお手伝いを致しますが、ここではまだ標準に関するいくつかの仕様をインポートするあなたの中のファイルにパッケージを導入した場合、それは次の形式ことをお勧めします。
import (
"fmt"
)
あなたのパッケージは3つのパッケージの種類、標準ライブラリパッケージ、内部のパッケージ、サードパーティ製のパッケージを導入した場合は、あなたのパッケージを整理するには、次の方法をお勧めします。
import (
"strings"
"myproject/models"
"myproject/controller"
"github.com/mysql"
)
スペース分離、最初の本当の標準ライブラリを使用して、異なる種類のパッケージの連続導入は、2番目の項目は、パッケージ、第三サードパーティ製のパッケージです。プロジェクト導入パッケージ内の相対パスを使用しないでください。
// 这是不好的导入
import “../pkg”
// 这是正确的做法
import “github.com/tx23/pkg”
- 変数は宣言した
複数の変数が一緒に宣言し、変数名を名前に_を使用していない、標準のこぶを使用して変数名を
変数のスコープの問題を踏むために=簡単:使用しない、関数の外VARを使用する必要性を確認します。
var (
Found bool
count int
)
- 文字列の循環問題の型の定義ので、
カスタムタイプがStringのメソッドを定義している場合は、印刷中に隠されたいくつかのバグを生成します。
type MyInt int
func (m MyInt) String() string {
return fmt.Sprint(m) //BUG:死循环
}
func(m MyInt) String() string {
return fmt.Sprint(int(m)) //这是安全的,因为我们内部进行了类型转换
}
- 名前のパラメータを返さないように
、あなたの関数は、コードの未満10行非常に短い場合は、名前の変数を使用する場合は簡単に隠されたバグにつながることができますので、あなたは、使用、または直接型を使用することができます。
func Foo(a int, b int) (string, ok){
}
戻り値の同じタイプの複数のパラメータがある場合はもちろん、そう名付けられたパラメータは、より明確にすることがあります。
func (f *Foo) Location() (float64, float64, error)
エラー処理
彼らは、ERRを返す任意の呼び出しを破棄することができないという原則のエラー処理を持つ必要があり、すべての契約_の使用を破棄しないでください。受信エラー、または誤るに戻るか、それはパニックにされていない、または大文字を使用しないように、ログにエラーが記録された情報を使用して、簡単な、しかし、あなたの過ちを意味表現するのに十分なあなたの過ちを維持しようとします。閉鎖コール注意
ループゴルーチン関数またはメソッドの呼び出しでは、サイクルパラメータの閉鎖機能を起動していない変数表示の呼び出しを使用してください
fori:=0;i<limit;i++{
go func(){ DoSomething(i) }() //错误的做法
go func(i int){ DoSomething(i) }(i)//正确的做法
}
論理処理でパニック無効
状況は本当に例えば、ファイルは、メインのパッケージで開くことができない、使用して実行してパニックにされていないだけで、データベースには、プログラムが正常に機能しないことが原因と接続することはできませんが、パッケージの他の外部インタフェースのためだけのパッケージで、パニックを持つことはできません採用インチ 強く、あなたがプログラムを終了するためにログインできるように、エラーを記録するために、メインパックでlog.Fatalを使用することをお勧めします。構造体の仕様
マルチライン形式の構造体の宣言と初期化:
次のように定義されます:
type User struct{
Username string
Email string
}
次のように初期化されます:
u := User{
Username: "astaxie",
Email: "[email protected]",
}
- 受け取った値型またはポインタ型
端部におけるポインタ値型または以下の主要な原理を参照のタイプを使用することです。
func(w Win) Tally(playerPlayer)int //w不会有任何改变
func(w *Win) Tally(playerPlayer)int //w会改变数据
:詳細については、を参照してください
https://code.google.com/p/go-wiki/wiki/CodeReviewComments#Receiver_Type
- ミューテックスを持つ構造体は、ポインタ受信機でなければなりません
あなたがミューテックスで構造体を定義した場合、その後、あなたの受信機はポインタでなければなりません
参考:
https://code.google.com/p/go-wiki/wiki/CodeReviewComments
http://golang.org/doc/effective_go.html