囲碁配列とスライスによる実験

6743 ワード


統語的糖分の単純さ
私はgoを学んできたように、私は言語を簡素化するために多くの決定は、Python、PowerShell、Cの経典などの言語でより簡潔な式を提供する多くの機能を削除して学んで成長している.Goのパラダイムによれば、言語の非直交特徴は何かをすることができるが、コストで多くの表現的な方法をもたらします.
私のバックグラウンドは、リレーショナルデータベースやセットベースのワークにも大きな焦点を当てているので、データベースの開発者や通常の開発者がバックエンドのコードを書く方法の基本的な違いは、どんなデータベースの関与からも、より多くのプログラミングパラダイムを研究していると理解しています.宣言ベースの構文ではなく、コレクションを繰り返し操作し、これらを操作することに多くのフォーカスを集中する必要があります.
私が仮定を調査したので、私は中でさえそれを見つけました.NET LINQ式は、単純な構文のためにループと反復の同じ基本概念を抽象化していますが、基本的に本当のセット選択をしていません.実際には、いくつかのケースでは、LINQのパフォーマンスは、しばしば簡単なループよりも悪いですstack overflow answer ) これに対するキャッチは、いくつかの劣化したパフォーマンス(延期された実行のような若干のシナリオを除く)のコストで企業環境でLINQ式がより保守的であるかもしれないということです.
例えば、PowerShellでは、多数の方法で配列で動作できます.
$array[4..10] | ForEach-Object {}
# or
foreach($item in $array[$start..$end]){}

この構文上の砂糖は簡潔さを提供します、しかし、私がこれを考える多くの間の2つの方法として、これはいろいろな方法とパフォーマンス考慮を加えます.同じ認識をするためにいくつかの方法だけを与えることによって、この認知負荷を取り除く.

ループの使用
この例はintスライスだけですが、私はオプションとしてrange 構造体を通しても.
この質問のためにこれらの例を通して働くとき、私はRubber Duck debugging , を使用してスライス選択を簡素化することができますnewSlice := arr[2:5] .

単純ループ
例として:Goplay Link To Run
package main
import "fmt"
func main() {
startIndex := 2
itemsToSelect := 3
arr := []int{10, 15, 20, 25, 35, 45, 50}
fmt.Printf("starting: arr: %v\n", arr)
newCollection := []int{}
fmt.Printf("initialized newCollection: %v\n", newCollection)
for i := 0; i < itemsToSelect; i++ {
newCollection = append(newCollection, arr[i+startIndex])
fmt.Printf("\tnewCollection: %v\n", newCollection)
}
fmt.Printf("= newCollection: %v\n", newCollection)
fmt.Print("expected: 20, 25, 35\n")
}```



This would result in:



```text
starting: arr: [10 15 20 25 35 45 50]
initialized newCollection: []
newCollection: [20]
newCollection: [20 25]
newCollection: [20 25 35]
= newCollection: [20 25 35]
expected: 20, 25, 35


移動ループ機能
囲碁で効果的な選択ライブラリがないと仮定して、私はこのような動作のための関数を書くと仮定しますGoplay Link To Run .
package main
import "fmt"
func main() {
startIndex := 2
itemsToSelect := 3
arr := []int{10, 15, 20, 25, 35, 45, 50}
fmt.Printf("starting: arr: %v\n", arr)
newCollection := GetSubselection(arr, startIndex, itemsToSelect)
fmt.Printf("GetSubselection returned: %v\n", newCollection)
fmt.Print("expected: 20, 25, 35\n")
}
func GetSubselection(arr []int, startIndex int, itemsToSelect int) (newSlice []int) {
fmt.Printf("newSlice: %v\n", newSlice)
for i := 0; i < itemsToSelect; i++ {
newSlice = append(newSlice, arr[i+startIndex])
fmt.Printf("\tnewSlice: %v\n", newSlice)
}
fmt.Printf("= newSlice: %v\n", newSlice)
return newSlice
}

これは以下のようになります:
starting: arr: [10 15 20 25 35 45 50]
newSlice: []
newSlice: [20]
newSlice: [20 25]
newSlice: [20 25 35]
= newSlice: [20 25 35]
GetSubselection returned: [20 25 35]
expected: 20, 25, 35

さらにこれをトリミングすると、スライス構文を使うことができました.Goplay Link To Run
func GetSubselection(arr []int, startIndex int, itemsToSelect int) (newSlice []int) {
fmt.Printf("newSlice: %v\n", newSlice)
newSlice = arr[startIndex:(startIndex + itemsToSelect)]
fmt.Printf("\tnewSlice: %v\n", newSlice)
fmt.Printf("= newSlice: %v\n", newSlice)
return newSlice
}


範囲
The range 式は、両方のインデックスと値を与え、それはマップと構造のためにも動作します.
あなたはまた、range エクスプレッション.
package main
import "fmt"
func main() {
startIndex := 2
itemsToSelect := 3
arr := []int{10, 15, 20, 25, 35, 45, 50}
fmt.Printf("starting: arr: %v\n", arr)
fmt.Printf("Use range to iterate through arr[%d:(%d + %d)]\n", startIndex, startIndex, itemsToSelect)
for i, v := range arr[startIndex:(startIndex + itemsToSelect)] {
fmt.Printf("\ti: %d v: %d\n", i, v)
}
fmt.Print("expected: 20, 25, 35\n")
}


スライス
言語は簡単ですが、スライスでいくつかの動作を理解するガードをキャッチ.
まず、自分の言語を明確にする必要がありました.私は配列のサブセットを探していたので、スライスは正しい選択でした.変更のない固定集合に対しては、標準の配列を使用します.
Tour On Go といいます.

An array has a fixed size. A slice, on the other hand, is a dynamically-sized, flexible view into the elements of an array. In practice, slices are much more common than arrays.


例えば、大きな配列でパフォーマンスを上げるために何をするかを考えてみたので、int配列にポインタを使いました.しかし、私はslice .
つまり、ポインタを使うことは有効ではなかった.これはスライスを通過するときはいつでも、他の多くのタイプとは異なり、参照によるパスです.
newCollection := GetSubSelection(&arr,2,3)
func GetSubSelection(arr *[]int){ ...

私は、これらの行動のいくらかが新しいGopherに全く直観的でないと思います、しかし、彼らを書くことはもう少し行動を明確にするのを助けました.

資源
これは私が学んだことについての少しのもめごとであるので、私はこれらを発見することによってこれらの発見のいくつかを固めることができました公共の
いくつかの例については、次の例を参照してください.
  • A Tour Of Go - Slices
  • Go By Example
  • Prettyslice GitHub Repo
  • 任意の洞察力がある場合は、コメントをここにドロップしてください.

    PowerShell社の技術