パッケージ変数を使ってはいけない
func Function(r *http.Request, db1 *mongo.Database) {
var error string
fmt.Printf("error %#v\n", error)
u := strings.Split(r.URL.Path, "/")
u2, err := strconv.Atoi(u[2])
if err != nil {
common.Test = "common.Test in"
error = err.Error()
time.Sleep(time.Second * 30)
log.Print(err)
fmt.Printf("error %#v\n", error)
fmt.Printf("common.Test %#v\n", common.Test)
}
error = "hey no error"
common.Test = "common.Test nothing"
fmt.Printf("error %#v\n", error)
fmt.Printf("common.Test %#v\n", common.Test)
}
Deferの挙動でも関数内で完結しなければいけない仕様があった
開発してて、過去のセッションのパッケージ変数のデータが残るといった現象が見られた
もしかしてと思い、パッケージ変数のテストを行った
上記のように条件分岐でエラーになった場合
パッケージ変数にデータをセット
Sleepで30秒待つ
パッケージ変数の値を確認
という処理を入れた
30秒間の間に別の条件分岐に入らないセッション、正常なセッションがあった場合
パッケージ変数は上書きされてしまう。
30秒後のパッケージ変数の値も
error "strconv.Atoi: parsing \"komatsu\": invalid syntax"
common.Test "common.Test nothing"
error "hey no error"
common.Test "common.Test nothing"
となってしまった。
当初はパッケージ変数、配列、mapを多用しようと思っていた
しかし、他のセッションでデータが共有されてしまうので全然使えない
引数と戻り値でデータの引き渡しをするには戻り値のデータが大きくなる事が過去にあったぐらいです。
パッケージ変数とかは使えないという事でした。
登録日:
更新日:
by
プログラマーこまつ