2015-02-12 14 views
11

in Go, le seguenti opere (nota uno uso della mappa ha un ritorno, l'altra ha due ritorni)mappa Return come 'ok' a Golang sulle funzioni normali

package main 

import "fmt" 

var someMap = map[string]string { "some key": "hello" } 

func main() { 
    if value, ok := someMap["some key"]; ok { 
     fmt.Println(value) 
    } 

    value := someMap["some key"] 
    fmt.Println(value) 
} 

Tuttavia, non ho idea come fare questa stessa cosa con la mia funzione. È possibile avere un comportamento simile con un reso opzionale come map?

Ad esempio:

package main 

import "fmt" 

func Hello() (string, bool) { 
    return "hello", true 
} 

func main() { 
    if value, ok := Hello(); ok { 
     fmt.Println(value) 
    } 

    value := Hello() 
    fmt.Println(value) 
} 

Wont compilare (a causa dell'errore multiple-value Hello() in single-value context) ... c'è un modo per fare questo lavoro sintassi per la funzione Hello()?

risposta

17

map è diverso perché è un integrato di tipo e non una funzione. Le 2 forme di accesso a un elemento di map sono specificate da Go Language Specification: Index Expressions.

Con le funzioni non è possibile farlo. Se una funzione ha 2 valori di ritorno, devi "aspettarti" entrambi o nessuno.

Tuttavia v'è permesso di assegnare uno dei valori di ritorno al Blank identifier:

s, b := Hello() // Storing both of the return values 

s2, _ := Hello() // Storing only the first 

_, b3 := Hello() // Storing only the second 

Si può anche scegliere di non memorizzare qualsiasi dei valori di ritorno:

Hello()   // Just executing it, but storing none of the return values 

Nota: si potrebbe anche assegnare entrambi i valori di ritorno all'identificatore vuoto, sebbene non abbia alcun uso (oltre a confermare che ha esattamente 2 valori di ritorno):

_, _ = Hello()  // Storing none of the return values; note the = instead of := 

Puoi anche provarli su Go Playground.

funzione Helper

Se lo usate molte volte e non si desidera utilizzare l'identificatore vuoto, creare una funzione di supporto, che scarta il 2 ° valore di ritorno:

func Hello2() string { 
    s, _ := Hello() 
    return s 
} 

Ed ora puoi fare:

value := Hello2() 
fmt.Println(value) 
+2

Avevo sospettato tanto, ma non ero sicuro di aver avuto problemi con google per i documenti/una risposta definitiva. Grazie per il riferimento anche ai documenti! –