2017-08-24 69 views
2

是否有可能使用匿名函數更新結構中的值?在蟒蛇,我會做一個拉姆達如下:結構上的匿名函數

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

這將把字符串中的動態id值。

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)指定爲lambda函數。

根據你的問題,目前尚不完全清楚你想如何工作。這裏是你可以做一個例子,雖然:

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) 

也沒有必要宣佈i爲指針,以Info然後返回它的價值。使用一個或另一個。

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

如果簽名複雜或多次使用,您也可以將其聲明爲類型。建立在Niko的鏈接上:https://play.golang.org/p/TTkquuKhM6。 http.HandlerFunc就是一個很好的例子。 – Peter