2013-01-24 7 views
17

Attualmente, per rappresentare una nuova riga nei programmi go, io uso \n. Ad esempio:Qual è il modo più portabile/multipiattaforma per rappresentare una nuova riga in go/golang?

package main 

import "fmt" 


func main() { 
    fmt.Printf("%d is %s \n", 'U', string(85)) 
} 

... produrrà 85 is U seguito da un ritorno a capo.

Tuttavia, questo non sembra tutto ciò che è multipiattaforma. Guardando altre lingue, PHP rappresenta questo con una costante globale (PHP_EOL). \n è il modo giusto per rappresentare le newline in modo specifico multipiattaforma in go/golang?

risposta

15

Sono incuriosito da questo, quindi ho deciso di vedere che cosa è esattamente fatto con fmt.Println. http://golang.org/src/pkg/fmt/print.go

Se si scorre fino in fondo, verrà visualizzato uno if addnewline dove viene sempre utilizzato \n. Non posso parlare a malapena se questo è il modo più "cross-platform" di farlo, e all'inizio era originariamente legato a Linux, ma è lì che è per la std lib.

Inizialmente avrei suggerito di usare solo fmt.Fprintln e questo potrebbe essere ancora valido come se la funzionalità corrente non fosse appropriata, un bug potrebbe essere archiviato e quindi il codice dovrebbe semplicemente essere compilato con l'ultima toolchain Go.

+0

E 'bene avere "\ n" per essere stampato direttamente ad alcuni di uscita flusso a causa della traduzione di nuova riga abilitata quando questo flusso di output non è binario. Questa è una proprietà della libreria di runtime C su cui si basa Go: converte automaticamente le terminazioni di linea in quelle utilizzate dalla piattaforma, quindi è sicuro usare solo "\ n" nel codice del programma. Questo funziona solo per i flussi non binari, e non sarà facile ottenere il separatore della linea della piattaforma (ad es. Come una stringa) usando solo il runtime C. –

+4

@VladimirMatveev, sei sicuro che Go sia basato sul runtime C? Sembra che i suoi compilatori standard non dipendano dal runtime di C e producano binari collegati in modo statico che non dipendono nemmeno da nulla. – kostix

+1

@kostix, sembra che tu abbia ragione. Guardare attraverso i meccanismi interni di Go I/O suggerisce che stanno usando POSIX 'open()' syscall su sistemi Unix e 'CreateFile' su sistemi Windows per aprire file. Il buffer fornito a 'os.File # Write' sembra essere inviato invariato direttamente alla funzione API' WriteFile' di Windows. Le funzioni API di Windows non eseguono conversioni di fine riga, quindi l'output conterrà solo LF nel caso in cui ci fosse solo LF nel sorgente. –

10

Avere il sistema operativo per determinare quale sia il carattere di nuova riga che si verifica in molti contesti è sbagliato. Quello che vuoi veramente sapere è che cosa è il separatore "record" e Go presume che tu, come il programmatore, dovresti saperlo.

Anche se il file binario viene eseguito su Windows, può essere utilizzato un file da un sistema operativo Unix.

terminazioni di linea sono determinati da ciò che la fonte del file o documento, ha detto era una linea che termina non il sistema operativo il file binario è in esecuzione in.