2016-03-23 20 views
5
  1. Quale versione di Go stai usando (vai versione)? https://play.golang.orgPerché è consentito "const true = false"?

  2. Cosa hai fatto?

eseguire un piccolo programma:

package main 

import "fmt" 

const true = false 

func main() { 
    if (true == false) { 
     fmt.Println("True equals to false") 
    } 
    fmt.Println("Hello World") 
} 

https://play.golang.org/p/KwePsmQ_q9

  1. cosa ti aspettavi di vedere?

Messaggio di errore o avviso che sto creando una costante con nome già definito e potenzialmente interrompendo l'intera app.

  1. Cosa hai visto invece?

In esecuzione senza problemi. Nessun avviso o altro per impedire la creazione di una nuova costante con un nome già definito.

+1

Divertente. "Var true = false" dà lo stesso risultato. Ma quando provo a dichiarare un pacchetto o un'importazione ottengo questo errore: "prog.go: 6: errore di sintassi: pacchetto inaspettato, in attesa del nome prog.go: 6: impossibile dichiarare il nome" – Vityata

+2

Possibile duplicato di [Perché sono 'nuovi 'e' make 'parole chiave non riservate?] (http://stackoverflow.com/questions/31987772/why-are-new-and-make-not-reserved-keywords) Si chiede 'new' e' make', ma 'true' è anche un [identificatore predeterminato] (https://golang.org/ref/spec#Predeclared_identifiers) che rende applicabili le risposte anche qui. – icza

+2

Né vere né false sono parole chiave (https://golang.org/ref/spec#Keywords) ma identificatori predeclared (https://golang.org/ref/spec#Predeclared_identifiers) e le ridefinite che va bene e funziona come l'intera lingua – Volker

risposta

9

true e false non sono parole chiave riservate. Questi sono identificatori predeterminati.

const (
     true = 0 == 0 // Untyped bool. 
     false = 0 != 0 // Untyped bool. 
) 

Ciò significa che true e false sono semplici due valori booleani senza tipo. Questo è il motivo per cui nell'esempio true è uguale a false.

https://golang.org/pkg/builtin/#pkg-constants