2016-09-08 7 views
-2

"は宣言され使用されていません"私は理解できません - 何か「本当に私はそれを使用しました」と何かタグを付ける必要がありますか?go:varは宣言されていますが使用されていないエラー - 回避するには?

func getInt(data map[string]interface{}, name string) (int, error) { 
    t := data[name] 
    if reflect.TypeOf(t).Kind() == reflect.Int { 
     return t.(int), nil 
    } 
    return 0, &apiError{1, "it's not an int"} 
} 

また、単一の関数にこれらを考慮する正しい方法上の任意の考えは歓迎されるだろう:奇妙なことに、私は、この関数からエラーを得ることはありません

func getString(data map[string]interface{}, name string) (string, error) { 
    s := data[name] 
    if reflect.TypeOf(s).Kind() != reflect.String { 
     return s.(string), nil 
    } 
    return "", &apiError{1, "it's not a string"} 
} 

!これは、コンパイルしgolang.org上の細かい動作しますので、あなたのエラーは別の場所で同じ識別子を使用して(宣言していない)から来ている

+0

エラーを再現できません。あなたはそれを引き起こすことのほかに何もないと確信していますか? https://play.golang.org/p/OpqqN7cBFZ – ale64bit

+0

「これらを単一の機能に含める」とはどういう意味ですか? 'getString'はマップから文字列を読み込んで返します。 'getInt'は、マップからintを読み込んで返します。 Goでは、これらは非常に異なる動作です。 –

+0

あなたのコードのどこかに別の "s"があり、あなたを混乱させるかもしれませんか? (ヒント:よりわかりやすい名前を使用してください)。 –

答えて

1

package main 

import "reflect" 

func main() { 
    m := make(map[string]interface{}) 
    m["foo"] = "25" 
    getString(m, "foo") 
} 

func getString(data map[string]interface{}, name string) (string, error) { 
    s := data[name] 
    if reflect.TypeOf(s).Kind() != reflect.String { 
     return s.(string), nil 
    } 
    return "", nil 
} 
+0

err ma gerrrd。私の防衛では、それはほぼ真夜中だった。ありがとう! –

0

あなたのコードが正しく見える、エラーが再現可能ではありません。 これらを1つの関数にリファクタリングすることはできますが、好みによっては好きではないかもしれません。

type VType int 
const (
    VInteger VType = iota 
    VString 
    VUnknown 
) 
func getValue(data map[string]interface{}, name string) (VType, int, string) { 
    switch v := data[name].(type) { 
    case int: 
     return VInteger, v, "" 
    case string: 
     return VString, 0, v 
    default: 
     return VUnknown, 0, "" 
    } 
} 
func main() { 
    m := make(map[string]interface{}) 
    m["foo"] = "25" 
    switch t, i, s := getValue(m, "foo"); t { 
    case VInteger: 
     fmt.Println("int ", i) //do something with int 
    case VString: 
     fmt.Println("string ", s) //do something with string 
    case VUnknown: 
     err := &apiError{1, "it's not an int"} //do something with err 
    } 
} 
+0

ありがとう!あなたが正しいです、これが状況の改善かどうかは疑問です。 –

関連する問題