🏠 ホーム
フロントエンド
PHP
Go言語
プログラミングの理解
プログラマーへの道
Google API

パッケージ変数を使ってはいけない

  プログラミング >     Go言語 >  

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

コメント         tweetでコメント