2015-07-30 32 views
8

Tôi có một đối tượng byte [] và tôi muốn lấy kích thước của nó theo byte. Có tương đương với sizeof của C() trong golang? Nếu không, bạn có thể đề xuất các cách khác để có được như vậy không?Kích thước của mảng byte golang

+1

Bạn có muốn độ dài, dung lượng hoặc kích thước trong bộ nhớ không? Tất cả chúng có thể khác nhau. – JimB

+0

Không, len cung cấp cho bạn số đối tượng trong một mảng không phải là kích thước theo byte của toàn bộ mảng. Tôi đoán @evanmcdonnal đã làm đúng .. –

+1

@ sr_149: bạn không nhận được kích thước của mảng với 'binary.Size', bạn nhận được' length * data_type_size'. Đây có thể là những gì bạn muốn, nhưng hãy nhớ kích thước của mảng (dung lượng) thường khác nhau. – JimB

Trả lời

6

Tôi nghĩ rằng đặt cược tốt nhất của bạn sẽ là;

package main 

import "fmt" 
import "encoding/binary" 

func main() { 
    thousandBytes := make([]byte, 1000) 
    tenBytes := make([]byte, 10) 
    fmt.Println(binary.Size(tenBytes)) 
    fmt.Println(binary.Size(thousandBytes)) 
} 

https://play.golang.org/p/HhJif66VwY

Mặc dù có rất nhiều lựa chọn, như chỉ nhập khẩu không an toàn và sử dụng sizeof;

import unsafe "unsafe" 

size := unsafe.Sizeof(bytes) 

Lưu ý rằng đối với một số loại, như slice, Sizeof sẽ cung cấp cho bạn kích thước của bộ mô tả lát có thể không phải là thứ bạn muốn. Ngoài ra, hãy ghi nhớ độ dài và dung lượng của slice là khác nhau và giá trị được trả về bởi binary.Size phản ánh độ dài.

+1

Nó không chỉ đơn giản để có được kích thước của bộ mô tả slice với Sizeof, bạn * chỉ * nhận được kích thước của bộ mô tả luôn là 3 từ. – JimB

+0

Cảm ơn bạn! : D sẽ sử dụng mã hóa/nhị phân pkg –

+0

@JimB có nhưng OP có thể xử lý mảng byte trong trường hợp nó hoạt động; https://play.golang.org/p/UQUcQYC9F3 cá nhân tôi nghĩ rằng các gói nhị phân hoạt động tốt hơn bởi vì nó sẽ không cung cấp cho bạn kích thước bộ mô tả slice nhưng OP đã làm cho tương đương với sizeof đó là unsafe.Sizeof. – evanmcdonnal

7

Để trả lại số byte trong một lát byte sử dụng len chức năng:

bs := make([]byte, 1000) 
sz := len(bs) 
// sz == 1000 

Nếu bạn có nghĩa là số lượng các byte trong mảng cơ bản sử dụng cap thay vì:

bs := make([]byte, 1000, 2000) 
sz := cap(bs) 
// sz == 2000 

Một byte được đảm bảo là một byte: https://golang.org/ref/spec#Size_and_alignment_guarantees.

+0

Cảm ơn @Caleb, vị thần chắc chắn đã giúp mọi thứ rõ ràng hơn nữa! –

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