2015-07-23 27 views
8

Trong Golang khi một biến được khai báo, nó được khởi tạo với giá trị bằng không như mô tả trong đặc tả.Có bắt buộc phải gán giá trị mặc định cho biến trong Golang không?

http://golang.org/ref/spec#The_zero_value

Nhưng là nó thực hành mã hóa tốt để làm cho sử dụng tài sản này và không khởi tạo một cách rõ ràng biến của bạn nếu nó cần phải khởi tạo với giá trị mặc định.

ví dụ như trong ví dụ sau

http://play.golang.org/p/Mvh_zwFkOu

package main 

import "fmt" 

type B struct { 
    isInit bool 
    Greeting string 
} 

func (b *B) Init() { 
    b.isInit = true 
    b.Greeting = "Thak you for your time" 
} 

func (b *B) IsInitialized() bool { 
    return b.isInit 
} 

func main() { 
    var b B 
    if !b.IsInitialized(){ 
     b.Init() 
    } 
    fmt.Println(b.Greeting) 
} 

chương trình dựa trên các giá trị mặc định của boolean là sai.

+1

Ngoài ra, nếu bạn chạy golint, nó sẽ gợi ý bạn bỏ nhiệm vụ thêm vì nó là giá trị mặc định. Đó là một công cụ tốt để bắt đầu với phong cách của Go. – LanceH

Trả lời

5

Như mọi người đã nói, đặc điểm kỹ thuật rõ ràng ở đây: tất cả bộ nhớ được khởi tạo (zeroed). Bạn nên tận dụng điều này như các gói tiêu chuẩn. Đặc biệt, nó cho phép bạn dựa vào "hàm tạo mặc định" cho các kiểu của riêng bạn và thường bỏ qua New() *T loại hàm có lợi cho &T{}.

Nhiều loại trong các gói tiêu chuẩn tận dụng điều này, một số ví dụ:

http.Client

Một khách hàng là một ứng dụng HTTP. Giá trị bằng không (DefaultClient) là một ứng dụng khách có thể sử dụng DefaultTransport.

Và sau đó bạn sẽ tìm thấy var DefaultClient = &Client{} được khai báo trong gói.

http.Server

Một Server xác định các thông số để chạy một máy chủ HTTP. Giá trị bằng không cho Máy chủ là cấu hình hợp lệ.

bytes.Buffer

Một Buffer là một bộ đệm biến có kích thước byte với Đọc và Viết phương pháp. Giá trị bằng không cho bộ đệm là bộ đệm trống sẵn sàng để sử dụng.

Điều này thật tuyệt vì bạn chỉ có thể làm var buf bytes.Buffer và bắt đầu sử dụng. Do đó, bạn sẽ thường thấy các biến thành viên boolean được sử dụng ở dạng "phủ định" - ví dụ InsecureSkipVerify trong tls.Config không được gọi là Verify, vì hành vi mặc định sẽ không xác thực chứng chỉ (nghĩ rằng tôi muốn false - hoặc không - giá trị được sử dụng cho các giá trị mặc định mong muốn).

Cuối cùng, trả lời câu hỏi của bạn:

Nhưng là nó tốt mã hóa thực hành để làm cho sử dụng tài sản này và không khởi tạo một cách rõ ràng biến của bạn nếu nó cần phải được khởi tạo với giá trị mặc định?

Vâng, đúng vậy.

6

Chỉ khởi tạo biến thành giá trị bằng 0 nếu bạn muốn sử dụng cú pháp khai báo ngắn.

//less verbose than ''var count int'' 
count := 0 
empty := "" 

Nếu không, khởi tạo chúng rõ ràng chỉ là tiếng ồn. Bạn có thể nghĩ rằng có điều gì đó sai với các biến chưa được khởi tạo ... và bạn sẽ đúng. May mắn thay, không có điều như vậy trong đi. Giá trị bằng không là một phần của thông số kỹ thuật và chúng sẽ không đột ngột thay đổi.

2

Khi một biến được khai báo nó chứa tự động zero hoặc null giá trị mặc định cho loại hình của nó: 0 cho int, 0.0 cho float, false cho bool, chuỗi rỗng cho string, nil cho con trỏ, zero-ed struct vv

Tất cả bộ nhớ trong Go được khởi tạo!.

Ví dụ: var arr [5]int trong bộ nhớ có thể được hình dung như:

+---+---+---+---+ | | | | | +---+---+---+---+ 0 1 2 3

Khi khai báo một mảng, mỗi mục trong nó sẽ tự động khởi tạo với mặc định không có giá trị của các loại, ở đây tất cả các mục mặc định Vì vậy, tốt hơn hết là nên khởi tạo mà không có giá trị mặc định, trong các trường hợp khác so với các tình huống khi bạn muốn khai báo một biến với giá trị mặc định một cách rõ ràng.

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