2015-02-20 16 views
5

Sto chiamando una funzione per eseguire una richiesta http, due parametri di riferimento passano per la funzione. Passo il [] byte all'interfaccia v. Voglio che la funzione aggiorni il valore di riferimento dell'interfaccia v. Il corpo della risposta è una stringa, voglio passare il valore della stringa all'interfaccia v. Tuttavia, ha provato molti modi ma non il successo.Passaggio di aggiornamento Golang per il valore di riferimento

Ecco il codice, è possibile vedere dichiaro byts come v.(*[]byte) al fine di rendere v aggiornato con il valore stringa del corpo di risposta. Ma non funziona. Il v è sempre nil. Si prega di suggerire qualsiasi modo per rendere v può essere aggiornato con il valore di stringa.

func (s *BackendConfiguration) Do(req *http.Request, v interface{}) error { 
    res, err := s.HTTPClient.Do(req) 
    defer res.Body.Close() 
    resBody, err := ioutil.ReadAll(res.Body) 

    if v != nil { 
      byts, ok := v.(*[]byte) 
      if len(resBody) > 0 {   
       byts = append(byts, resBody...) 
       return nil 
      } 
     } 
    } 

    return nil 
} 
+1

Perché non tornare '(interfaccia {}, err)'? In questo modo potresti usare 'return byts, nil' dopo l'append – serejja

+2

Voglio solo sottolineare che questo è ancora passato per valore ... il valore che viene copiato è il puntatore .. non quello che punta a ... # nitpick –

+2

Mostraci il codice come si chiama questo metodo 'Do()'. Controlla anche la variabile 'ok'. Ma molto probabilmente il valore 'v' che passi è ** non ** di tipo' * [] byte'! – icza

risposta

8

Beh, il motivo principale per questo non funziona è perché si pensa di "chiamata di riferimento", un concetto completamente sconosciuto to Go. Assolutamente tutto viene chiamato in valore in Go e una volta che si specifica quale sia una slice di byte, un puntatore a una slice di byte, un puntatore alla slice di byte racchiusa all'interno di un'interfaccia, una copia del puntatore a una slice di byte estratta dall'interfaccia, e così via si vedrà come aggiornare il valore del puntatore a punti fetta byte:

package main 
import "fmt" 
func f(v interface{}) { 
    pbs := v.(*[]byte) 
    *pbs = append(*pbs, []byte{9,8,7}...) 
} 
func main() { 
    bs := []byte{1,2,3} 
    pbs := &bs 
    var v interface{} = pbs 
    f(v) 
    fmt.Printf("%v\n", *pbs) 
} 
+0

Grazie mille. Funziona. –

Problemi correlati