2016-03-14 79 views
5

Nel pacchetto golang.org/x/sys/windows/svc v'è un esempio che contiene questo codice:tubo in Golang

const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown | svc.AcceptPauseAndContinue 

cosa significa il carattere pipe |?

+1

[Bitwise OR] (https://golang.org/ref/spec#Arithmetic_operators). – bereal

risposta

19

Come altri hanno già detto, è l'operatore OR [bitwise] bit a bit. Più in particolare, gli operatori vengono utilizzati per creare flag di bitmap, che è un modo di combinare le costanti di opzioni basate sull'aritmetica bit per bit. Ad esempio, se si dispone di costanti di opzione che sono potenze di due, in questo modo:

const (
    red = 1 << iota // 1 (binary: 001) (2 to the power of 0) 
    green    // 2 (binary: 010) (2 to the power of 1) 
    blue    // 4 (binary: 100) (2 to the power of 2) 
) 

Poi si possono combinare con l'operatore OR in questo modo:

const (
    yellow = red | green   // 3 (binary: 011) (1 + 2) 
    purple = red | blue   // 5 (binary: 101) (1 + 4) 
    white = red | green | blue // 7 (binary: 111) (1 + 2 + 4) 
) 

in modo che fornisce semplicemente un modo per poter combinare le costanti di opzioni basate sull'aritmetica bit a bit, basandosi sul modo in cui le potenze di due sono rappresentate nel sistema di numeri binari; nota come i bit binari vengono combinati quando si utilizza l'operatore OR. (Per ulteriori informazioni, vedere this example nel linguaggio di programmazione C.) Quindi combinando le opzioni nell'esempio, si sta semplicemente consentendo al servizio di accettare l'arresto, lo spegnimento e sospendere e continuare i comandi.

1

Il | non è il carattere pipe qui, ma il carattere o, uno dei bit di manipolazione.

Ad esempio, 1 | 1 = 1, 1 | 2 = 3, 0 | 0 = 0.

+0

'1 | 2' è '3'. – bereal

+0

@ bereal, sì, mi dispiace per il mio lapsus della penna. – starkshang