“ _,” (เครื่องหมายจุลภาคขีดล่าง) ในการประกาศ Go คืออะไร?


103

และดูเหมือนฉันจะไม่เข้าใจการประกาศตัวแปรประเภทนี้:

_, prs := m["example"]

" _," กำลังทำอะไรกันแน่และเหตุใดพวกเขาจึงประกาศตัวแปรเช่นนี้แทนที่จะเป็น

prs := m["example"]

(ฉันพบว่าเป็นส่วนหนึ่งของGo by Example: Maps )


3
สำหรับคำถามเกี่ยวกับภาษาในอนาคตโปรดดูข้อมูลจำเพาะก่อน ควรตอบทุกคำถามของคุณ
fuz

เป็นความคิดเห็น: prsอาจหมายถึง "ปัจจุบัน" โค้ดในตัวอย่างของคุณกำลังตรวจสอบว่ามีหรือไม่มีรายการ"example"อยู่ในmแผนที่
dyoo

7
@FUZxxl ใช่ฉันเคยดูที่นั่นก่อนหน้านี้ แต่เนื่องจากฉันไม่ทราบชื่อของฟีเจอร์จึงไม่พบ นอกจากนี้ฉันพบข้อกำหนดอย่างเป็นทางการสำหรับภาษาโปรแกรมที่ไม่ได้มีการเรียนการสอนมากนักและค่อนข้างเรียนรู้จากตัวอย่าง
Kansuler

@dyoo เมื่อฉันมีคำอธิบายด้านล่างฉันก็พบว่ามันมีความหมาย แต่ควรสังเกตว่ามีคนอื่นมีคำถามเดียวกันหรือไม่!
Kansuler

8
@FUZxxl: ฉันไม่รู้ คำถามส่วนใหญ่ที่ถามใน SO อาจมีคำตอบอยู่ที่ไหนสักแห่ง มีเกณฑ์บางประการซึ่งอาจไม่ควรถามคำถาม แต่ฉันไม่คิดว่าคำถามนี้จะอยู่ภายใต้นั้น
บาท

คำตอบ:


123

หลีกเลี่ยงการประกาศตัวแปรทั้งหมดสำหรับค่าที่ส่งคืน
มันถูกเรียกว่าตัวระบุว่างเปล่า

ใน:

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

( กรณีการใช้งาน ' ' อื่น ๆ_สำหรับการนำเข้า )

เนื่องจากจะละทิ้งค่าที่ส่งคืนจึงมีประโยชน์เมื่อคุณต้องการตรวจสอบค่าที่ส่งคืนเพียงค่าเดียวเช่นใน " วิธีทดสอบการมีอยู่ของคีย์ในแผนที่ " ที่แสดงใน "การไปที่มีประสิทธิภาพแผนที่ ":

_, present := timeZone[tz]

หากต้องการทดสอบการมีอยู่ในแผนที่โดยไม่ต้องกังวลเกี่ยวกับค่าที่แท้จริงคุณสามารถใช้ตัวระบุว่างเครื่องหมายขีดล่าง ( _)
ตัวระบุว่างสามารถกำหนดหรือประกาศด้วยค่าประเภทใดก็ได้โดยค่านี้จะถูกละทิ้งโดยไม่เป็นอันตราย
สำหรับการทดสอบสถานะในแผนที่ให้ใช้ตัวระบุว่างแทนตัวแปรปกติสำหรับค่า

ดังที่Jsorเพิ่มในความคิดเห็น :

"มาตรฐานที่ยอมรับโดยทั่วไป" คือการเรียกตัวแปรทดสอบการเป็นสมาชิกว่า "ok" (เหมือนกันสำหรับการตรวจสอบว่าช่องที่อ่านถูกต้องหรือไม่)

ที่ให้คุณรวมเข้ากับการทดสอบ:

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

คุณจะพบว่ามันวนซ้ำ:

หากคุณต้องการเฉพาะรายการที่สองในช่วง (ค่า) ให้ใช้ตัวระบุว่างขีดล่างเพื่อทิ้งรายการแรก:

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

ขอบคุณที่ให้ตัวอย่างที่ดี ฉันต้องใช้ความคิดพอสมควรกว่าจะเข้าใจแนวคิด แต่ตอนนี้ฉันทำแล้ว!
Kansuler

โปรดทราบว่า IME "มาตรฐานที่ยอมรับโดยทั่วไป" คือการเรียกตัวแปรทดสอบการเป็นสมาชิกว่า "ok" (เช่นเดียวกับการตรวจสอบว่าช่องที่อ่านถูกต้องหรือไม่)
LinearZoetrope

1
@Jor ฉันเห็นด้วย ฉันได้รวมความคิดเห็นของคุณไว้ในคำตอบเพื่อให้สามารถมองเห็นได้มากขึ้นและได้เพิ่มตัวอย่างเพิ่มเติมบางส่วน
VonC

68

คอมไพเลอร์ Go ไม่อนุญาตให้คุณสร้างตัวแปรที่คุณไม่เคยใช้

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

รหัสด้านบนจะแสดงข้อความแสดงข้อผิดพลาด "ฉันประกาศและไม่ได้ใช้"

เนื่องจากเราไม่ได้ใช้ i ในลูปของเราเราจึงต้องเปลี่ยนเป็นสิ่งนี้:

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

15
ประโยคแรกของคุณเป็นสิ่งสำคัญที่จะต้องเข้าใจเหตุผลว่าทำไมจึงมี _ เป็นตัวระบุว่าง
Tarik

4

_คือตัวระบุว่าง ความหมายที่ควรกำหนดจะถูกละทิ้ง

นี่คือค่าของ exampleคีย์ที่ถูกทิ้ง บรรทัดที่สองของรหัสที่จะยกเลิกการปรากฏตัวprsบูลีนและจัดเก็บค่าใน
ดังนั้นในการตรวจสอบการมีอยู่ในแผนที่เท่านั้นคุณสามารถทิ้งค่าได้ สิ่งนี้สามารถใช้เพื่อใช้แผนที่เป็นชุดได้


4

ตัวระบุว่างอาจถูกใช้เมื่อใดก็ตามที่ไวยากรณ์ต้องการชื่อตัวแปร แต่ตรรกะของโปรแกรมไม่ใช้เช่นเพื่อละทิ้งดัชนีลูปที่ไม่ต้องการเมื่อเราต้องการเฉพาะค่าองค์ประกอบ

ตัดตอนมาจาก:

ภาษาโปรแกรม Go (Addison-Wesley Professional Computing Series)

Brian W. Kernighan

เนื้อหานี้อาจได้รับการคุ้มครองโดยลิขสิทธิ์


2

เรียกว่าตัวระบุว่างและช่วยในกรณีที่คุณต้องการทิ้งค่าที่จะส่งคืนและไม่อ้างอิง

สถานที่บางแห่งที่เราใช้:

  • ฟังก์ชันจะส่งคืนค่าและคุณไม่ต้องการใช้ในอนาคต
  • คุณต้องการทำซ้ำและต้องการค่า i ที่คุณจะไม่ใช้

2

กรณีการใช้งานที่ดีสำหรับตัวแปรที่ไม่ได้ใช้คือสถานการณ์เมื่อคุณต้องการเอาต์พุตเพียงบางส่วน ในตัวอย่างด้านล่างเราจำเป็นต้องพิมพ์ค่า (ประชากรของรัฐ) เท่านั้น

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

1

โดยทั่วไป_,เรียกว่าตัวระบุว่าง ใน GO เราไม่สามารถมีตัวแปรที่ไม่ได้ใช้

เป็นอินสแตนซ์เมื่อคุณวนซ้ำผ่านอาร์เรย์หากคุณใช้value: = rangeคุณไม่ต้องการค่าiสำหรับการวนซ้ำ แต่ถ้าคุณไม่ใส่ค่า i ก็จะส่งกลับข้อผิดพลาด แต่ถ้าคุณประกาศว่าฉันและไม่ได้ใช้มันก็จะแสดงข้อผิดพลาด

_,ดังนั้นว่าเป็นสถานที่ที่เราจะต้องใช้

นอกจากนี้ยังใช้เมื่อคุณไม่ต้องการค่าตอบแทนของฟังก์ชันในอนาคต


0

ไม่อนุญาตให้ใช้ตัวแปรที่ไม่ได้ใช้ใน Golang

หากคุณมาจากภาษาโปรแกรมอื่นอาจรู้สึกยากที่จะคุ้นเคยกับสิ่งนี้ แต่ส่งผลให้โค้ดสะอาดขึ้น ดังนั้นโดยใช้ a _เรากำลังบอกว่าเรารู้ว่ามีตัวแปรอยู่ที่นั่น แต่เราไม่ต้องการใช้และบอกคอมไพเลอร์ว่าไม่บ่นฉันเกี่ยวกับเรื่องนี้ :)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.