“_,” (Dấu phẩy gạch dưới) trong khai báo cờ vây là gì?


100

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

_, prs := m["example"]

Chính xác thì " _," đang làm gì và tại sao họ lại khai báo một biến như thế này thay vì

prs := m["example"]

(Tôi tìm thấy nó như một phần của Go by Ví dụ: Bản đồ )


3
Đối với các câu hỏi về ngôn ngữ trong tương lai, vui lòng xem kỹ thông số trước. Nó sẽ trả lời tất cả các câu hỏi của bạn.
fuz

Như một nhận xét: prscó lẽ là viết tắt của "hiện tại". Mã trong ví dụ của bạn đang kiểm tra sự hiện diện hay vắng mặt của một mục nhập "example"trong mbản đồ.
dyoo

6
@FUZxxl Có, tôi đã xem ở đó trước đây, nhưng vì tôi không biết tên của đối tượng địa lý nên tôi không tìm thấy nó. Ngoài ra, tôi 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 được sư phạm cho lắm và tôi nên học bằng cách lấy ví dụ.
Kansuler

@dyoo Khi tôi có lời giải thích bên dưới, tôi đã tìm ra ý nghĩa của nó, nhưng đáng lưu ý nếu ai đó có cùng câu hỏi!
Kansuler

8
@FUZxxl: Tôi không biết. Hầu hết các câu hỏi được hỏi trên SO có lẽ đã có sẵn câu trả lời ở đâu đó. Có một số ngưỡng tồn tại, dưới ngưỡng đó có lẽ không nên hỏi một câu hỏi, nhưng tôi không nghĩ rằng câu hỏi này nằm dưới đó.
thb

Câu trả lời:


120

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

Như trong:

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

( trường hợp sử dụng khác ' _' là để nhập khẩu )

Vì nó loại bỏ giá trị trả về, nên sẽ hữu ích khi bạn chỉ muốn kiểm tra một trong các giá trị được trả về, như trong " Cách kiểm tra sự tồn tại của khóa trong bản đồ? " Được hiển thị trong " Bản đồ hiệu quả ":

_, present := timeZone[tz]

Để kiểm tra sự hiện diện trong bản đồ mà không cần lo lắng về giá trị thực tế, bạn có thể sử dụng số nhận dạng trống, một dấu gạch dưới đơn giản ( _).
Số nhận dạng trống có thể được gán hoặc khai báo với bất kỳ giá trị nào thuộc bất kỳ loại nào, với giá trị bị loại bỏ một cách 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 vào trong các bình luận :

"tiêu chuẩn được chấp nhận chung" là gọi các biến kiểm tra thành viên là "ok" (tương tự để kiểm tra xem kênh đọc có 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 cũng sẽ tìm thấy nó trong vòng lặp:

Nếu bạn chỉ cần mục thứ hai trong phạm vi (giá trị), hãy sử dụng số nhận dạng trống, dấu gạch dưới, để loại bỏ mục đầu tiên:

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

Cảm ơn vì đã đưa ra một ví dụ tốt. Tôi đã mất một chút suy nghĩ để hiểu khái niệm này, nhưng bây giờ tôi đã làm được!
Kansuler

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

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

63

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
}

Đoạn 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 tôi không sử dụng i bên trong vòng lặp của chúng tôi, chúng tôi cần thay đổi nó thành thế này:

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

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

4

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

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


3

Mã định danh trống có thể được sử dụng bất cứ khi nào cú pháp yêu cầu tên biến nhưng logic chương trình thì không, chẳng hạn như để loại bỏ chỉ mục vòng lặp không mong muốn khi chúng ta chỉ yêu cầu giá trị phần tử.

Đoạn trích từ:

Ngôn ngữ lập trình Go (Dòng máy tính chuyên nghiệp Addison-Wesley)

Brian W. Kernighan

Tài liệu này có thể được bảo vệ bởi bản quyền.


2

Nó được gọi là số nhận dạng trống và nó hữu ích trong các trường hợp bạn muốn loại bỏ giá trị sẽ được trả về và không tham chiếu đến nó

Một số nơi chúng tôi sử dụng nó:

  • Một hàm trả về một giá trị và bạn không có ý định sử dụng nó trong tương lai
  • Bạn muốn lặp lại và cần một giá trị i mà bạn sẽ không sử dụng

2

Trường hợp sử dụng tuyệt vời cho biến không sử dụng là tình huống khi bạn chỉ cần một đầu ra một phần. Trong ví dụ dưới đây, chúng ta chỉ cần in giá trị (dân số trạng thái).

package main
import (
    "fmt"
)
func main() {
          statePopulations := map[string]int{
          "California": 39250017,
          "Texas":      27862596,
          "Florida":    20612439,
          }
          for _, v := range statePopulations {
          fmt.Println(v)
    }
}

1

Về cơ bản, _,được gọi là số nhận dạng trống. Trong GO, chúng ta không thể có các biến không được sử dụng.

Như một ví dụ khi bạn lặp qua một mảng nếu bạn đang sử dụng giá trị: = dải ô mà bạn không muốn có giá trị i để lặp. Nhưng nếu bạn bỏ qua giá trị i, nó sẽ trả về một lỗi. Nhưng nếu bạn khai báo i và không sử dụng nó, nó cũng sẽ trả về một lỗi.

Do đó, đó là nơi mà chúng ta phải sử dụng _,.

Ngoài ra, nó được sử dụng khi bạn không muốn giá trị trả về của một hàm trong tương lai.


0

Một biến không sử dụng không được phép trong Golang

Nếu bạn đến từ các ngôn ngữ lập trình khác, điều này có thể cảm thấy hơi khó làm quen với điều này. Nhưng điều này dẫn đến mã sạch hơn. Vì vậy, bằng cách sử dụng _chúng ta đang nói rằng chúng ta biết có một biến ở đó nhưng chúng ta không muốn sử dụng nó và nói với trình biên dịch rằng đừng phàn nàn với tôi về nó. :)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.