2017-08-24 5 views
2

構造体で匿名関数を使用して値を更新することはできますか?文字列に動的なid値を置きます構造体の匿名関数

inspect = lambda id: '/api/{}/inspect'.format(id) 

:Pythonで私は、ラムダで次の操作を行います。 Go

は、私は彼のようなものをしようとしています:

type Info struct { 
    Inspect string 
} 

func Assign() Info { 
    i := &Info{} 
    i.Inspect = return func(id) {return fmt.Sprintf("/api/%s/inspect", id)} 
    return *i 
} 

しかし、私はこのような値は更新したい:

temp := Assign() 
tempID := temp.Inspect("test") 
fmt.Println("/api/test/inspect") 

答えて

2

ゴーが静的に型付けされ、パイソンが動的に型付けされます。つまり、Goでは、各変数の型を宣言(またはコンパイラに推論させる)しなければならず、常にその型にとどまらなければなりません。したがって、Inspectプロパティ(タイプ:string)をラムダ関数として割り当てることはできません。

質問に基づいて、これがどのくらい正確に機能するかは完全にはっきりしていません。ここでは、しかし、あなたは何ができるかの例です:

type Info struct { 
    Inspect func(string) string 
} 

func Assign() Info { 
    i := Info{} 
    i.Inspect = func(id string) string { return fmt.Sprintf("/api/%s/inspect", id) } 
    return i 
} 

そうようにあなたがそれを使用することができます。

temp := Assign() 
tempID := temp.Inspect("test") 
fmt.Println(tempID) 

Infoへのポインタとしてiを宣言してから返却する必要もありませんそれの価値。どちらか一方を使用してください。

Here遊び場にあります。

+1

ハ!ちょうど私にそれを打つ。 –

1

構造体のプロパティとして無名関数を定義することはできますが、その型は関数の戻り値ではなく、関数の完全な署名でなければなりません。

type Info struct { 
    Inspect func(string) string 
} 

func Assign() Info { 
    i := &Info{} 
    i.Inspect = func(id string) string { 
     return fmt.Sprintf("/api/%s/inspect", id) 
    } 
    return *i 
} 


func main() { 
    temp := Assign() 
    tempID := temp.Inspect("test") 
    fmt.Println(tempID) 
} 

ここでそので遊ぶこと自由に感じなさい:https://play.golang.org/p/IRylodv2cZ

+1

シグネチャが複雑であるか、何度も使用されている場合は、シグネチャを型として宣言することもできます。ニコのリンク構築:https://play.golang.org/p/TTkquuKhM6。 http.HandlerFuncはこれの顕著な例です。 – Peter

関連する問題