2015-01-04 41 views
42

Tôi mới làm quen với Golang và cố gắng tìm hiểu nó, đến từ PHP và Java."_" trong tuyên bố của Golang là gì?

Và tôi dường như không thể hiểu được loại này khai báo biến:

_, prs := m["example"] 

gì chính xác là "_" làm gì và tại sao có họ tuyên bố một biến như thế này thay vì

prs := m["example"] 

Tôi tìm thấy nó trong ví dụ này: https://gobyexample.com/maps

Cảm ơn vì đã giúp tôi!

+3

Đối với câu hỏi ngôn ngữ trong tương lai, xin vui lòng có một cái nhìn tại [đặc tả] (http: // golang. org/ref/spec) trước tiên. Nó sẽ trả lời tất cả các câu hỏi của bạn. – fuz

+0

Là một nhận xét: 'prs' có thể là viết tắt của" hiện tại ". Mã trong ví dụ của bạn là kiểm tra sự hiện diện hoặc vắng mặt của một mục nhập cho '" example "' trong bản đồ 'm'. – dyoo

+2

@FUZxxl Có, tôi đã có một cái nhìn ở đó trước đây, nhưng khi tôi không biết tên của các tính năng, tôi đã không tìm thấy nó. Ngoài ra tôi tìm thấy các thông số kỹ thuật chính thức cho các ngôn ngữ lập trình không phải là rất sư phạm và thay vì tìm hiểu bằng ví dụ. – Kansuler

Trả lời

59

Nó tránh phải khai báo tất cả các biến cho giá trị trả về.
Nó được gọi là blank identifier.

Như trong:

_, y, _ := coord(p) // coord() returns three values; only interested in y coordinate 

(các other '_' use case is for import)

Vì nó loại bỏ các giá trị trả về, nó là hữu ích khi bạn muốn kiểm tra chỉ là một trong các giá trị trở lại, như trong "How to test key existence in a map?" thể hiện trong "Effective Go, map":

_, present := timeZone[tz] 

để kiểm tra sự hiện diện trong bản đồ với lo lắng về giá trị thực tế, bạn có thể sử dụng số nhận dạng trống, dấu gạch dưới đơn giản (_).
Mã định danh trống có thể được gán hoặc khai báo với bất kỳ giá trị nào thuộc loại nào, với giá trị bị loại bỏ vô hại.
Để kiểm tra sự hiện diện trong bản đồ, hãy sử dụng số nhận dạng trống thay cho biến thông thường cho giá trị.

Như Jsor thêm in the comments:

"tiêu chuẩn chung được chấp nhận" là để gọi các biến kiểm tra thành viên "ok" (tương tự để kiểm tra nếu đọc kênh là hợp lệ hay không)

Điều đó cho phép bạn kết hợp nó với thử nghiệm:

if _, err := os.Stat(path); os.IsNotExist(err) { 
    fmt.Printf("%s does not exist\n", path) 
} 

Bạn sẽ thấy nó cũng trong vòng lặp:

Nếu bạn chỉ cần mục thứ hai trong khoảng (giá trị), sử dụng định danh trống, một dấu gạch dưới, để loại bỏ các đầu tiên:

sum := 0 
for _, value := range array { 
    sum += value 
} 
+0

Cảm ơn bạn đã đưa ra một ví dụ điển hình. Nó đã cho tôi một số suy nghĩ để hiểu khái niệm, nhưng bây giờ tôi làm! – Kansuler

+0

Lưu ý rằng IME "thường được chấp nhận tiêu chuẩn" là gọi các biến kiểm tra thành viên "ok" (tương tự để kiểm tra xem một kênh đã đọc có hợp lệ hay không). – LinearZoetrope

+0

@Jsor Tôi đồng ý. Tôi đã bao gồm nhận xét của bạn trong câu trả lời để có thêm tầm nhìn và thêm một vài ví dụ bổ sung. – VonC

3

_ là số nhận dạng trống. Có nghĩa là giá trị nó cần được gán sẽ bị loại bỏ.

Đây là giá trị của example khóa bị hủy. Dòng mã thứ hai sẽ loại bỏ sự hiện diện boolean và lưu trữ giá trị trong prs.
Vì vậy, để chỉ kiểm tra sự hiện diện trên bản đồ, bạn có thể hủy giá trị. Điều này có thể được sử dụng để sử dụng bản đồ làm bộ.

+0

Giải thích của bạn cũng đã giúp tôi, cảm ơn bạn! – Kansuler

25

Trình biên dịch Go sẽ không cho phép bạn tạo các biến mà bạn không bao giờ sử dụng.

for i, value := range x { 
    total += value 
} 

Mã trên sẽ trả về thông báo lỗi "tôi đã khai báo và không sử dụng".

Vì chúng ta không sử dụng i bên trong vòng lặp, chúng ta cần phải thay đổi nó như thế này:

for _, value := range x { 
    total += value 
} 
+1

Câu đầu tiên của bạn là quan trọng để hiểu lý do tại sao có một _ như một định danh trống. – Tarik

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