In Vai, se si definisce un nuovo tipo ad es .:Perché posso digitare le funzioni alias e usarle senza eseguire il cast?
type MyInt int
Non si può quindi passare un MyInt
a una funzione in attesa di un int, o viceversa:
func test(i MyInt) {
//do something with i
}
func main() {
anInt := 0
test(anInt) //doesn't work, int is not of type MyInt
}
fine. Ma perché è allora che lo stesso non si applica alle funzioni? es .:
type MyFunc func(i int)
func (m MyFunc) Run(i int) {
m(i)
}
func run(f MyFunc, i int) {
f.Run(i)
}
func main() {
var newfunc func(int) //explicit declaration
newfunc = func(i int) {
fmt.Println(i)
}
run(newfunc, 10) //works just fine, even though types seem to differ
}
Ora, non mi lamento perché consente di risparmiare me dover gettato esplicitamente newfunc
digitare MyFunc
, come avrei dovuto fare nel primo esempio; sembra solo incoerente. Sono sicuro che c'è una buona ragione per questo; qualcuno può illuminarmi?
Il motivo che mi chiedo è soprattutto perché vorrei accorciare alcuni dei miei tipi di funzione piuttosto lunghi in questo modo, ma voglio fare in modo ci si aspetta ed accettabile per fare questo :)
** In Vai, non v'è alcuna cosa come un 'tipo alias'. ** Il' type' parola chiave introduce nuovi tipi di nome. Non sono alias. (Questo è uno dei punti di forza di Go rispetto a vari altri linguaggi) –
@ Rick-777 C'è qualcosa come alias di tipo, ad esempio 'byte' è alias di' uint8' e 'rune' è alias di' int32', ma è vero che la parola chiave 'type' non crea alias ma nuovi tipi. – icza
Sì, grazie per averlo indicato - ci sono due casi speciali: byte e rune. Questi * sono * alias, ma non è possibile creare nuovi alias. https://golang.org/ref/spec#Numeric_types –