2017-11-29 15 views
0

このコードは機能しません。構造体のフィールドが "名前ではありません"(ゴラン)

package main 

import "fmt" 
import "os" 

type foo struct { 
    Bar string 
    Baz int 
} 

func main() { 
    var j foo 

    val, ok := os.LookupEnv("SOME VAR") 
    if (! ok) { 
     panic("lookup failed!") 
    } 
    j.Bar = val 
    fmt.Printf("j.Bar is now %s\n",j.Bar) 
} 

私は本当に「非名」で困惑していますエラー:

package main 

import "fmt" 
import "os" 

type foo struct { 
    Bar string 
    Baz int 
} 

func main() { 
    var j foo 

    // this next line fails with "non-name j.Bar on left side of :=" 
    j.Bar, ok := os.LookupEnv("SOME VAR") 
    if (! ok) { 
     panic("lookup failed!") 
    } 
    fmt.Printf("j.Bar is now %s\n",j.Bar) 
} 

は今、私は仕事に簡単に変更することができます。それはj.Barは「非名」であることを不平を言います。 j.Barは文字列です。 os.LookupEnv() returns a stringを最初の値として使用します。だから、文字列を取って文字列変数に入れるのはどうですか?

+0

参照: https://github.com/golang/go/issues/6842 – jrefior

答えて

4

演算子:=は、新しい変数を同時に宣言し、値を代入します。 j.Barは、Goの有効な変数名ではありません。変数名にピリオドを含めることはできません。さて、明らかに、名前にピリオドのある変数ではなく、構造体フィールドに値を代入しようとしています(コンパイラはそれを知りません)。あなたは宣言せずに、単に割り当てを使用して、これを行うことができます。

var ok bool 
j.Bar, ok = os.LookupEnv("SOME VAR") 

あるいはこれを、一度に2つの変数を宣言:

bar,ok := os.LookupEnv("SOME VAR") 
if ok { 
    j.Bar = bar 
} 

も参照してください:Go tour on short variable declarationsthe spec on short variable declarationsを。

関連する問題