2015-12-14 11 views
8

Precursore: sto appena iniziando a bagnarmi i piedi con il golang.Esiste una funzione min integrata per una porzione di argomenti int o un numero variabile di argomenti int in golang?

Questa potrebbe rivelarsi una domanda sciocca in quanto è abbastanza semplice eseguire questi calcoli, ma ho intenzione di chiederlo comunque perché non ho trovato una risposta quando ho cercato su Google.

C'è un costruito in funzione che restituisce il minimo di una fetta di argomenti int:

func MinIntSlice(v []int) (m int) { 
    if len(v) > 0 { 
     m = v[0] 
    } 
    for i := 1; i < len(v); i++ { 
     if v[i] < m { 
      m = v[i] 
     } 
    } 
    return 
} 

O il minimo di un numero variabile di argomenti int:

func MinIntVarible(v1 int, vn ...int) (m int) { 
    m = v1 
    for i := 0; i < len(vn); i++ { 
     if vn[i] < m { 
      m = vn[i] 
     } 
    } 
    return 
} 

In caso contrario, è la migliore "convenzione" semplicemente per creare un pacchetto che contenga aiutanti come questo?

risposta

14

Non c'è un built-in per questo.

Se è necessaria questa funzionalità solo in un pacchetto, è possibile scrivere una funzione non esportata (ad esempio minIntSlice).

Se è necessaria questa funzionalità in più pacchetti, è possibile creare un pacchetto e inserirvi funzioni simili. Si dovrebbe considerare di rendere questo pacchetto interno (https://golang.org/s/go14internal).

Alcuni suggerimenti su come migliorare il tuo codice:

  1. MinIntSlice restituirà 0 per una fetta di vuoto. Comunque 0 è un elemento min valido pure. Penso che chiamare il panico su una fetta vuota sia un'opzione migliore.

  2. Uso ciclo gamma:

    for _, e := range v { 
        if e < m { 
         m = e 
        } 
    } 
    
+0

Questo è un pezzo utile di feedback . Non ero ancora stato esposto alla "portata". – Jesse

+0

Grazie per il puntatore ai pacchetti "interni". Ho duplicato funzioni non esportate come questa, e l'interno sembra il modo migliore per mantenerle. –

0

Come @kostya dichiarato correttamente non c'è min built-in o una funzione max in Golang.

Tuttavia, vorrei suggerire una soluzione leggermente diversa:

func MinMax(array []int) (int, int) { 
    var max int = array[0] 
    var min int = array[0] 
    for _, value := range array { 
     if max < value { 
      max = value 
     } 
     if min > value { 
      min = value 
     } 
    } 
    return min, max 
} 

Con che il problema di una fetta vuoto è risolto: un errore di runtime rivela (index out of range)

Problemi correlati