2013-02-18 23 views
15

Sto leggendo il codice del pacchetto time, quindi desidero sapere come funziona lo func After(d Duration) <-chan Time.Che cosa significa una funzione senza corpo?

ho trovato il codice segue:

func After(d Duration) <-chan Time { 
    return NewTimer(d).C 
} 

func NewTimer(d Duration) *Timer { 
    c := make(chan Time, 1) 
    t := &Timer{ 
     C: c, 
     r: runtimeTimer{ 
      when: nano() + int64(d), 
      f: sendTime, 
      arg: c, 
     }, 
    } 
    startTimer(&t.r) 
    return t 
} 

così ho trovato la definizione di startTimer - E 'così strano che la funzione startTimer non dispone di un corpo della funzione.

func startTimer(*runtimeTimer) 

Voglio sapere che:

  1. Dove è il vero codice di startTimer
  2. Perché un barattolo "metodo astratto" esiste qui
  3. Perché l'autore di Go ha scritto in questo modo

Grazie!

risposta

22

1) La funzione è definita here:

// startTimer adds t to the timer heap. 
//go:linkname startTimer time.startTimer 
func startTimer(t *timer) { 
    if raceenabled { 
     racerelease(unsafe.Pointer(t)) 
    } 
    addtimer(t) 
} 

2) Function declarations:

Una dichiarazione di funzione può omettere il corpo. Tale dichiarazione fornisce la firma per una funzione implementata all'esterno di Go, come una routine di assemblaggio.

3) Non tutti i linguaggi di programmazione possono esprimere interamente il proprio tempo di esecuzione (C può, ad esempio). Parti del runtime Go e la libreria standard sono in C, le parti sono in assembly mentre altre sono in .goc, che è un ibrido non ben documentato di Go e C.

+0

@CheneyEah, vedere [questo thread] (http: //groups.google.com/group/golang-nuts/browse_thread/thread/134e72302b9a3441/d44169a540437357) per maggiori informazioni sui file '.goc'. – kostix

+1

startTimer() la funzione declratioin link è rotta –