2014-11-17 17 views

Trả lời

18

Bạn có thể sử dụng chức năng unsafe.Sizeof cho việc này. Nó trả về kích thước tính bằng byte, chiếm bởi giá trị bạn chuyển vào nó. Dưới đây là 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)) 
} 

Hãy lưu ý rằng một số nền tảng không cho phép một cách rõ ràng việc sử dụng không an toàn, bởi vì nó là .. tốt, không an toàn. Điều này được sử dụng để bao gồm AppEngine. Không chắc chắn nếu đó vẫn là trường hợp ngày hôm nay, nhưng tôi tưởng tượng như vậy.

Như ghi chú @Timur Fayzrakhmanov, reflect.TypeOf(variable).Size() sẽ cung cấp cho bạn thông tin tương tự. Đối với gói reflect, giới hạn tương tự cũng như đối với gói unsafe. I.e: một số nền tảng có thể không cho phép sử dụng nó.

+0

Điều gì cho biết kích thước? Byte? –

+1

@TimurFayzrakhmanov: Có: "Sizeof trả về kích thước theo byte bị chiếm bởi giá trị v.". –

+2

Vui lòng thêm câu trả lời của bạn vào phần bổ sung này: 'reflect.TypeOf (variable) .Size()'. Nó cho cùng một giá trị. –

4

Kích thước của một biến có thể được xác định bằng cách sử dụng unsafe.Sizeof(a). Kết quả sẽ vẫn giữ nguyên cho một loại nhất định (ví dụ: int, int64, string, struct v.v.), bất kể giá trị nó nắm giữ. Tuy nhiên, đối với loại string, bạn có thể quan tâm đến kích thước của chuỗi mà biến tham chiếu và điều này được xác định bằng cách sử dụng hàm len(a) trên một chuỗi nhất định. Đoạn dưới đây minh họa rằng kích thước của một biến kiểu chuỗi luôn luôn là 8 nhưng chiều dài của một chuỗi một biến tài liệu tham khảo có thể thay đổi:

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)) 
} 

Output:

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

Phần cuối của câu hỏi của bạn là về việc chỉ định độ dài (ví dụ: giá trị int) cho một số string. Điều này có thể được thực hiện bởi s := strconv.Itoa(i) trong đó i là một biến số intstring được trả về bởi hàm được gán cho s.

Lưu ý: tên của hàm chuyển đổi là Itoa, có thể là dạng viết tắt của Integer to ASCII. Hầu hết các lập trình viên Golang có khả năng đọc sai tên hàm là Iota.

+0

"kích thước của một biến loại chuỗi luôn là 8". Không, kích thước của bộ mô tả chuỗi là 8 hoặc 16 byte. Ví dụ: 's1 size: string, 16' và' s2 size: string, 16'. – peterSO

+0

"Hầu hết các lập trình viên Golang có khả năng đọc sai tên hàm [' strconv.Itoa'] là 'Iota'." Không có khả năng, "Trong một tuyên bố liên tục, số nhận dạng được khai báo trước [iota] (http://golang.org/ref/spec#Iota) đại diện cho các hằng số nguyên không thành công liên tiếp." – peterSO

0

Từ đi/src/math/bit:

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

tôi đã không kiểm tra nó, nhưng tôi hy vọng nó sẽ được nhanh hơn unsafe.Sizeof().

BTW, kể từ (^ uint (0) >> 32 & 1) lợi nhuận hạn 0 trên 32bit vòm và 1 trên 64bit vòm, bạn có thể đặt bất kỳ sức mạnh của hai giá trị ở bên trái của toán tử < <. Vì vậy ...

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

trả về kích thước (uint) tính theo byte.

Các vấn đề liên quan