Go – funzioni

3

L’esame di Go continua. Sempre seguendo il Caleb. Mi è stato detto che è una telenovela noiosa, forse non a torto, ma ha una sua ragione per essere così. E anche la distribuzione in pillole quasi omeopatiche (quasi nèh, il contenuto c’è!) è voluto. Quasi. Come oggi che la faccio lunga su un argomento tutt’altro che originale, le funzioni.
Caleb usa la mia metafora preferita, la black box, che qualcuno critica. OK, basta metablog.
Come il C / C++ c’è la funzione main(), quella che abbiamo visto finora, ma i veri programmatori producono funzioni come se piovesse.
Esempio, così per vedere come si fa:

package main

import "fmt"

func average(xs[] float64) float64 {
    total := 0.0
    for _, v := range xs {
        total += v
    }
    return total / float64(len(xs))
}

func main() {
    xs := []float64{98, 93, 77, 82, 83}
    fmt.Println(average(xs))
}

ave

Ecco, ci sono alcune differenze rispetto al C:

la funzione inizia con func, seguita dalla lista variabile e tipo tra parentesi e infine il tipo che ritorna e la graffa aperta, che abbiamo già vista dev’essere su quella linea.

Le funzioni vedono solo quello che c’è al loro interno e le variabili globali (e le funzioni), ovvio. E ovviamente l’esempio:

package main

import "fmt"

var x int = 5

func f() {
    fmt.Println(x)
}

func main() {
    f()
}

Ecco x è globale, definita fuori da f() e main().

Una funzione può ritornare più valori, sì come in Python:

func f() (int, int) {
    return 5, 6
}

func main() {
    x, y := f()
}

Questo risulta utile per ritornare un codice d’errore oltre al valore della funzione. E come la printf() del C ci sono le funzioni variadic, con un un numero variabile di argomenti (sì, ci sono in parecchi linguaggi ormai). usando … prima del tipo dell’ultimo parametro si indica che ci saranno zero o più di questi parametri. Sì la Println() è fatta così:

func Println(a ...interface{}) (n int, err error)

Su interface{} ne riparleremo.

package main

import "fmt"

func add(args ... int) int {
    total := 0
    for _, v := range args {
        total += v
    }
    return total
}

func main() {
    fmt.Println(add(1,2,3))
}

variadic

Inoltre si possono passare slices, nell’esempio precedente avremmo potuto scrivere:

package main

import "fmt"

func add(args ... int) int {
    total := 0
    for _, v := range args {
        total += v
    }
    return total
}

func main() {
    xs := []int{1, 2, 3}
    fmt.Println(add(xs...))
}

slice

OK? Dai! Go non è così noioso come sembra, secondo me, nèh? 😉 😮 😀

Posta un commento o usa questo indirizzo per il trackback.

Commenti

  • b3h3m0th (@b3h3m0th)  Il 7 dicembre 2012 alle 13:00

    Sto seguendo con molto interesse i tuoi articoli su Go, all’inizio ero restio a studiarlo, ma devo dire, o meglio ammettere, che col passare del tempo mi sto appassionando. Lo trovo estremamente moderno ma ancora mi sfugge il motivo per il quale è stato creato.

    Avrei una domanda su Go, mi piacerebbe sapere quali sono state le ragioni per le quali google ha voluto creare un nuovo linguaggio.

    • juhan  Il 7 dicembre 2012 alle 13:11

      La domanda andrebbe fatta a Google. Così a sentimento, secondo me: 1) il gruppo originario di Unix e C non ha mai accettato il C++; 2) il C è vecchio, specie per quanto detto all’1; 3) linguaggi ne nascono ogni giorno, c’è una selezione naturale (per fortuna); 4) le macchine di oggi sono molto diverse da quelle di allora e uno dei problemi è la concorrenza; 5) N altri motivi (che non so o che ci dovrei pensare).
      Poi che funzioni o abbia successo è ancora tutto da vedere. E non è detto che quelli che poi vengono adottati siano i migliori, prendi Java! (OK, considerazione personale).

      • b3h3m0th (@b3h3m0th)  Il 8 dicembre 2012 alle 00:06

        Se doveva esplodere sarebbe esploso da tempo, comunque vedremo, del resto Rob Pike non è il primo venuto … anche se con google ha perso il suo appeal da pioniere.

        Ultimamente comunque mi sto divertendo parecchio con Lua, c’è un windows manager per UNIX, dal nome inequivocabile: “awesome”, gestisce l’intera configurazione con moduli scritti in Lua, è un vero spasso, ha una usabilità incredibile e può essere esteso mediante scripting Lua, Probabilmente awesome ha mandato in pensione fluxbox, di cui ero affezionato utente da anni. Comunque, sarebbe molto interessante leggere un articolo a riguardo – su Lua ovviamente.

        grazie per le informazioni su Go.

      • juhan  Il 8 dicembre 2012 alle 06:46

        b3h3moth saresti interessato a raccontarci di Lua qui sul blog? Saresti il benvenuto e ci faresti contenti (e saputi) 😀

      • b3h3m0th (@b3h3m0th)  Il 8 dicembre 2012 alle 12:03

        sarebbe un onore per me contribuire. Ci lavorerò ok

      • juhan  Il 8 dicembre 2012 alle 12:13

        OK, ti faccio mettere tra i collaboratori. Però devi mandarmi la tua mail @ n1n0.aegis@gmail.com

  • Bruno  Il 7 dicembre 2012 alle 17:25

    …ma chi critica l’esempio della black box? Cosa diavolo è una funzione, anche matematica, se non una scatola nera? 🙂
    input->elaborazione->output: è così naturale, in realtà, che non mi viene in mente nessun altro esempio calzante….
    Grazie per gli articoli, BTW, molto interessanti.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo di WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

%d blogger hanno fatto clic su Mi Piace per questo: