2014-11-17 30 views

risposta

18

È possibile utilizzare la funzione unsafe.Sizeof per questo. Restituisce la dimensione in byte, occupata dal valore che ci passi sopra. Ecco a working example:

package main 

import "fmt" 
import "unsafe" 

func main() { 
    a := int(123) 
    b := int64(123) 
    c := "foo" 
    d := struct { 
     FieldA float32 
     FieldB string 
    }{0, "bar"} 

    fmt.Printf("a: %T, %d\n", a, unsafe.Sizeof(a)) 
    fmt.Printf("b: %T, %d\n", b, unsafe.Sizeof(b)) 
    fmt.Printf("c: %T, %d\n", c, unsafe.Sizeof(c)) 
    fmt.Printf("d: %T, %d\n", d, unsafe.Sizeof(d)) 
} 

Si precisa che per alcune piattaforme non consentire esplicitamente l'uso di sicuro, perché è .. bene, non sicuri. Questo includeva AppEngine. Non sono sicuro che sia ancora così oggi, ma immagino di sì.

Come note @Timur Fayzrakhmanov, reflect.TypeOf(variable).Size() fornirà le stesse informazioni. Per il pacchetto reflect, la stessa restrizione vale per il pacchetto unsafe. I.e: alcune piattaforme potrebbero non consentirne l'uso.

+0

Cosa indica la dimensione? Byte? –

+1

@TimurFayzrakhmanov: Sì: "Sizeof restituisce la dimensione in byte occupata dal valore v.". –

+2

Per favore, aggiungi alla tua risposta questa aggiunta: 'reflect.TypeOf (variable) .Size()'. Dà gli stessi valori. –

4

La dimensione di una variabile può essere determinata utilizzando unsafe.Sizeof(a). Il risultato rimarrà lo stesso per un dato tipo (ad esempio int, int64, string, struct ecc.), Indipendentemente dal valore che detiene. Tuttavia, per il tipo string, potresti essere interessato alle dimensioni della stringa a cui fa riferimento la variabile e questo viene determinato utilizzando la funzione len(a) su una stringa specifica. Il seguente frammento mostra che la dimensione di una variabile di tipo stringa è sempre 8, ma la lunghezza di una stringa che una variabile fa riferimento può variare:

package main 

import "fmt" 
import "unsafe" 

func main() { 
    s1 := "foo" 
    s2 := "foobar" 

    fmt.Printf("s1 size: %T, %d\n", s1, unsafe.Sizeof(s1)) 
    fmt.Printf("s2 size: %T, %d\n", s2, unsafe.Sizeof(s2)) 
    fmt.Printf("s1 len: %T, %d\n", s1, len(s1)) 
    fmt.Printf("s2 len: %T, %d\n", s2, len(s2)) 
} 

uscita:

s1 size: string, 8 
s2 size: string, 8 
s1 len: string, 3 
s2 len: string, 6 

L'ultima parte della tua domanda riguarda l'assegnazione della lunghezza (ovvero un valore int) a string. Questo può essere fatto da s := strconv.Itoa(i) dove i è una variabile int e il string restituito dalla funzione viene assegnato a s.

Nota: il nome della funzione convertitore è Itoa, eventualmente un modulo breve per Intero in ASCII. La maggior parte dei programmatori di Golang probabilmente interpretano erroneamente il nome della funzione come Iota.

+0

"la dimensione di una variabile di tipo string è sempre 8". No, la dimensione del descrittore di stringhe è di 8 o 16 byte. Ad esempio, 's1 size: string, 16' e' s2 size: string, 16'. – peterSO

+0

"La maggior parte dei programmatori Golang probabilmente interpretano erroneamente il nome della funzione [' strconv.Itoa'] come 'Iota'." Non è probabile che "all'interno di una dichiarazione costante, l'identificatore predetto [iota] (http://golang.org/ref/spec#Iota) rappresenti successive costanti di interi non tipizzate." – peterSO

0

Da go/src/math/bit:

const uintSize = 32 << (^uint(0) >> 32 & 1) // 32 or 64 

non ho la prova, ma mi aspetto di essere più veloce di unsafe.Sizeof().

proposito, dal momento che il (^ uint (0) >> 32 & 1) restituisce termine 0 su Arch 32bit e 64bit 1 su arco, si può inserire qualsiasi potenza di due valore a sinistra dell'operatore < <. Quindi ...

const uintSize = 4 << (^uint(0) >> 32 & 1) // 4 or 8 

restituisce la dimensione di (uint) in byte.

Problemi correlati