2022/12/15

golang option pattern

 - golang option pattern - option struct ``` type option struct { Name string Age int } ``` - option func type ``` type Option func(*options) func F1(name string) Option{ return fun(op *option){ op.Name = name } } } func F2(age int) Option{ return func(op *option) { op.Age= age } } ``` - usage ``` func NewOption(setters ...Option){ op := &option{} for s:=range setters{ s(op) } return...

2022/12/14

what is good bulk insert

To get optimal write throughput for bulk loads, partition your data by primary key with this pattern:  Each partition contains a range of consecutive rows. Each commit contains data for only a single partition. A good rule of thumb for your number of partitions is 10 times the number of nodes in your Cloud Spanner instance. So if you have N nodes, with a total of 10*N partitions, you can assign rows to partitions by:  Sorting your data by primary key. Dividing it into 10*N separate sections. Creating a set of worker tasks that upload...

golang chunk

 - chunk ``` func Chunk[T any](items []T, chunkSize int) [][]T { var chunks = make([][]T, 0, (len(items)/chunkSize)+1) for chunkSize < len(items) { items, chunks = items[chunkSize:], append(chunks, items[0:chunkSize:chunkSize]) } return append(chunks, items) } //Arrayをスライシングすると、リターンされたSliceのcapはstartIndexからArrayの最期までのサイズです。 //しかし、次のようにスライシングする時、maxIndexを追加してcapのサイズを調整することが出来ます。 //slice[startIndex:endIndex:maxIndex] ...

big array goroutine

 - https://qiita.com/tutuz/items/057452fbbe9a5ae26d37 - multi goroutine to loop array ``` slice := []string{"a", "b", "c", "d", "e"} sliceLength := len(slice) var wg sync.WaitGroup wg.Add(sliceLength) fmt.Println("Running for loop…") for i := 0; i < sliceLength; i++ { go func(i int) { defer wg.Done() val := slice[i] fmt.Printf("i: %v, val: %v\n", i, val) }(i) } wg.Wait() fmt.Println("Finished for loop") ``` - 課題はエラー検知とgoroutineの数の制御、errgroupの登場...

2022/12/08

golang fmt %q

文字列を””で囲んで出力する。これで実際の を””に表現して、わかりやすい spannerのgolang clientで%qを使っているIt's just quite a strange decision made by Google here, to assume that the String() function is only used for logging and it's ok to add quotes...package mainimport ( "fmt")func main() { str := "Gopherくん" slice := []string{"g", "o", "h", "e", "r"} integer := 12450 fmt.Printf("1:出力は %q となります。\n", str) fmt.Printf("2:出力は %s となります。\n", str) fmt.Printf("3:出力は %q となります。\n", slice) fmt.Printf("4:出力は %s となります。\n", slice) fmt.Printf("5:出力は %d となります。\n", integer) fmt.Printf("6:出力は %q となります。\n",...

2022/12/07

spanner nullable data type golang

 spanner nullable data type```// NullableValue is the interface implemented by all null value wrapper types.type NullableValue interface { // IsNull returns true if the underlying database value is null. IsNull() bool}```- how to use - difference between null,"","someValue" - null - spanner.NullString(valid=false) - "" - spanner.NullString(valid=true,value="") - update(value[*NullableValue]->model[NullableValue]) - update target items - value is not nil - not update target items - value is nil -...

go instal where ?

go install xxx..xxx==>the location is ~/go/binso ,set the ~/go/bin to .bash_profiles 's PATHgo versiongo help environment``` GOBIN The directory where 'go install' will install a command. GOPATH For more details see: 'go help gopath'. GOROOT The root of the go tree.```go help gopath```If the environment variable is unset, GOPATH defaultsto a subdirectory named "go" in the user's home directory($HOME/go on Unix, %USERPROFILE%\go on Windows),unless that directory holds a Go distribution.Run "go env GOPATH" to see the current GOPATH.```go env GOPATH==>~/gogo...

golang model

https://go.dev/play/p/B7ErJjt8JqU modelの役割ですが、① entity,usecase,repo,querierなど繋ぐ② validationなどの業務ロジックの担保②の配慮でmodelのfiledは非公開で、Setter都度Validationする、常に完璧な状態を求めて、trade-offで使いにくく、①の役割を損する。なので、①の役割をPrimativeなstruct(一旦voと呼ぶ)に分担する方いいかなと思う。vo<=>modelの変換は手間ですが、複雑ではないので、ある程度自動作成できる。 -- go.mod --module samplego 1.19-- model/name.go --package modelimport "errors"type Name struct { string}func NewName(v string) (Name, error) { n := Name{v} if err := n.validate(); err != nil { return Name{}, err } return n, nil}func (n Name) validate()...

2022/12/02