質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

解決済

1回答

3590閲覧

envconfigの使い方

hiro2222

総合スコア12

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2020/04/28 11:48

編集2020/04/28 11:50

envconfigを使いたく、下記の公式READMEを参照して実行してみたのですが結果がREADMEと異なっており困っております。
https://github.com/kelseyhightower/envconfig#usage
以下、詳細を記述します。

ソースコード

.env

env

1export MYAPP_DEBUG=false 2export MYAPP_PORT=8080 3export MYAPP_USER=Kelsey 4export MYAPP_RATE="0.5" 5export MYAPP_TIMEOUT="3m" 6export MYAPP_USERS="rob,ken,robert" 7export MYAPP_COLORCODES="red:1,green:2,blue:3"

main.go

go

1package main 2 3import ( 4 "fmt" 5 "log" 6 "time" 7 8 "github.com/kelseyhightower/envconfig" 9) 10 11type Specification struct { 12 Debug bool 13 Port int 14 User string 15 Users []string 16 Rate float32 17 Timeout time.Duration 18 ColorCodes map[string]int 19} 20 21func main() { 22 var s Specification 23 err := envconfig.Process("myapp", &s) 24 if err != nil { 25 log.Fatal(err.Error()) 26 } 27 format := "Debug: %v\nPort: %d\nUser: %s\nRate: %f\nTimeout: %s\n" 28 _, err = fmt.Printf(format, s.Debug, s.Port, s.User, s.Rate, s.Timeout) 29 if err != nil { 30 log.Fatal(err.Error()) 31 } 32 33 fmt.Println("Users:") 34 for _, u := range s.Users { 35 fmt.Printf(" %s\n", u) 36 } 37 38 fmt.Println("Color codes:") 39 for k, v := range s.ColorCodes { 40 fmt.Printf(" %s: %d\n", k, v) 41 } 42}

実行コマンド

bash

1$ go get "github.com/kelseyhightower/envconfig" 2$ go run main.go

実行結果

bash

1Debug: false 2Port: 0 3User: 4Rate: 0.000000 5Timeout: 0s 6Users: 7Color codes:

期待される結果

bash

1Debug: false 2Port: 8080 3User: Kelsey 4Rate: 0.500000 5Timeout: 3m0s 6Users: 7 rob 8 ken 9 robert 10Color codes: 11 red: 1 12 green: 2 13 blue: 3

どのようにすれば改善できるでしょうか・・・?
初歩的な質問となりますが、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

単に環境変数が EXPORT されていないだけかと思います。

明示的に Go のソースの中で環境変数をセットすると期待通りの結果が得られます。

go

1package main 2 3import ( 4 "fmt" 5 "log" 6 "os" 7 "time" 8 9 "github.com/kelseyhightower/envconfig" 10) 11 12func init() { 13 os.Setenv("MYAPP_DEBUG", "false") 14 os.Setenv("MYAPP_PORT", "8080") 15 os.Setenv("MYAPP_USER", "Kelsey") 16 os.Setenv("MYAPP_RATE", "0.5") 17 os.Setenv("MYAPP_TIMEOUT", "3m") 18 os.Setenv("MYAPP_USERS", "rob,ken,robert") 19 os.Setenv("MYAPP_COLORCODES", "red:1,green:2,blue:3") 20} 21 22type Specification struct { 23 Debug bool 24 Port int 25 User string 26 Users []string 27 Rate float32 28 Timeout time.Duration 29 ColorCodes map[string]int 30} 31 32func main() { 33 var s Specification 34 err := envconfig.Process("myapp", &s) 35 if err != nil { 36 log.Fatal(err.Error()) 37 } 38 format := "Debug: %v\nPort: %d\nUser: %s\nRate: %f\nTimeout: %s\n" 39 _, err = fmt.Printf(format, s.Debug, s.Port, s.User, s.Rate, s.Timeout) 40 if err != nil { 41 log.Fatal(err.Error()) 42 } 43 44 fmt.Println("Users:") 45 for _, u := range s.Users { 46 fmt.Printf(" %s\n", u) 47 } 48 49 fmt.Println("Color codes:") 50 for k, v := range s.ColorCodes { 51 fmt.Printf(" %s: %d\n", k, v) 52 } 53}

https://play.golang.org/p/igLrSM0BH6U

投稿2020/04/28 12:17

d_tutuz

総合スコア730

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hiro2222

2020/04/28 15:34

回答ありがとうございます。 それでも動くと思いますが、現在.envに設定してから用いる方法が知りたいです。
d_tutuz

2020/04/28 15:51

そうであれば、シェルの実行コマンドの前に source .env を実行する、で環境変数が export されますよ
hiro2222

2020/04/30 05:14

ありがとうございます!無事出来ました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問