On 07/03/2015 03:36 PM, enrico franchi wrote:
 Parli di override o di overload?
Oddio, confondo sempre i termini...
Quello che mi interessava fare era semplicemente questo:

func Sum(a, b int) int {
  return a + b
}

func Sum(a, b float) float {
  return a + b
}

Certo, posso usare anche SumInt e SumFloat, ma diventa molto piu` complesso, ovvero potrei avere un caso in cui non so il tipo di variabile e prima me lo devo andare a cercare (a meno di non fare evidenti cast di variabili). Per inciso, ricordo un thread su di un gruppo Facebook in cui si criticava specificatamente la mancanza di questa caratteristica (e in cui era uscita anche questa cosa simpatica: http://play.golang.org/p/Isoo0CcAvr )

Credo che tu non abbia chiara la gestione degli errori in Go.
Guarda, faccio prima a farti vedere cosa intendo: prendiamo questo caso:

package main

import (
  "fmt"
)

func Sum(a int, b *int) int {
    return a + *b;
}

func main() {
    var first int
    var second *int

    first = 1
    second = nil
    fmt.Println(Sum(first, second))
}

Questo codice genera, ovviamente, un runtime error in quanto passo un puntatore nil come argomento della somma. Ora, per gestire questa situazione, posso sicuramente fare un check che le variabili siano valorizzate, ma questo non mi protegge da altri "imprevisti". Per capirci, una situazione del genere in Python la gestirei cosi`:

def sum(a, b):
    return a + b

if __name__ == "__main__":
    try:
        print(sum(1, None))
    except:
        print("Argh!")

(il che potrebbe essere deprecabile in alcuni contesti, mentre in altri, e.g. per gestire la morte prematura delle connessioni da parte di un client, potrebbe essere una facility non indifferente)

(o meglio, della versione castrata che e' implementata nei vari Python, Java, C++ e combriccola con cui sei probabilmente familiare)
Per curiostia`, perche` sarebbero castrate?

puoi usare panic.
Panic da quello che ho visto manda in traceback l'applicativo, ovvero e` l'equivalente di un raise in Python o di un throw in Java. Quello che vorrei fare io e` il catch

(vedi gli esempi nella stdlib di Go)
Uhm, a quali esempi ti riferisci?

Io personalmente trovo che la gestione degli errori di Go rende il codice complessivamente molto piu' snello.
Dipende dal concetto di snello che hai Per esempio, se per creare un file, devo fare questo:

file, err := os.Create(filename)
if err != nil {
  panic(err)
}
defer file.Close()

invece di questo:

try:
    with open(filename, "w") as f:
        # Codice
except:
    raise Exception("Argh!")

beh, io trovo piu` snella e chiara la seconda :)

Enrico
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python

Rispondere a