ไม่มีตัวแปรใหม่ทางด้านซ้ายของ: =


104

เกิดอะไรขึ้นที่นี่?

package main

import "fmt"

func main() {

    myArray  :=[...]int{12,14,26}  ;     
    fmt.Println(myArray)

    myArray  :=[...]int{11,12,14} //error pointing on this line 

    fmt.Println(myArray) ;

}

มันแสดงข้อผิดพลาดที่ระบุว่า

no new variables on left side of :=

สิ่งที่ฉันทำคือกำหนดค่าใหม่ให้กับตัวแปรที่ประกาศไปแล้ว


ลองmyArray,x = [...]int{11,12,14},3
Mr Lou

คำตอบ:


138

ลบออกcolon :จากคำสั่งที่สองในขณะที่คุณกำลังกำหนดค่าใหม่ให้กับตัวแปรที่มีอยู่

myArray = [...]int{11,12,14}

colon :myArray :=[...]int{12,14,26}จะใช้เมื่อคุณดำเนินการประกาศในระยะสั้นและได้รับมอบหมายเป็นครั้งแรกในขณะที่คุณกำลังทำอยู่ในคืองบครั้งแรกของคุณ


26

มีสองประเภทของผู้ประกอบการที่ได้รับมอบหมายในการเดินทางเป็นและ:= =มีความหมายเทียบเท่ากัน (เกี่ยวกับการกำหนด) แต่คำแรกคือ "การประกาศตัวแปรสั้น" ( http://golang.org/ref/spec#Short_variable_declarations ) ซึ่งหมายความว่าทางด้านซ้ายเราต้องมีอย่างน้อย การประกาศตัวแปรใหม่เพื่อให้ถูกต้อง

คุณสามารถเปลี่ยนวินาทีให้เป็นคำสั่งมอบหมายงานอย่างง่าย:=-> =หรือจะใช้ตัวแปรใหม่ก็ได้หากเป็นไปตามอัลกอริทึมของคุณ


และ:=ไม่สามารถใช้กับ_? เช่น_ := someFunc()
stt106

7

ตามหมายเหตุด้านข้างการประกาศซ้ำจะปรากฏในการประกาศแบบสั้นหลายตัวแปรเท่านั้น

การอ้างอิงจากข้อกำหนดภาษา:

ซึ่งแตกต่างจากการประกาศตัวแปรทั่วไปการประกาศตัวแปรแบบสั้นอาจประกาศตัวแปรใหม่หากเดิมมีการประกาศก่อนหน้านี้ในบล็อกเดียวกันด้วยประเภทเดียวกันและตัวแปรที่ไม่ว่างเปล่าอย่างน้อยหนึ่งตัวเป็นตัวแปรใหม่ ด้วยเหตุนี้การประกาศซ้ำจะปรากฏในการประกาศแบบสั้นหลายตัวแปรเท่านั้น การประกาศซ้ำไม่แนะนำตัวแปรใหม่ เพียงแค่กำหนดค่าใหม่ให้กับค่าเดิม

package main

import "fmt"


func main() {
    a, b := 1, 2
    c, b := 3, 4

    fmt.Println(a, b, c)
}

นี่คือตัวอย่างที่ดีมากเกี่ยวกับการประกาศตัวแปรซ้ำใน golang: https://stackoverflow.com/a/27919847/4418897


ขอบคุณสำหรับหมายเหตุ ฉันสับสนกับการประกาศสั้น ๆ หลายตัวแปรซึ่งอธิบายได้ว่าทำไม
Li Jinyao

7
myArray  :=[...]int{12,14,26}

ตามที่ระบุไว้โดยผู้แสดงความคิดเห็นก่อนหน้านี้ :=เป็นชนิดของสั้นมือและ / หรือแบบสั้นของตัวแปรประกาศ

ดังนั้นในสถานะข้างต้นคุณกำลังทำสองสิ่ง

  1. คุณกำลังประกาศตัวแปรของคุณจะเป็นmyArray
  2. คุณกำลังกำหนดอาร์เรย์ของจำนวนเต็มให้กับตัวแปรmyArray

ส่วนที่สองของรหัสของคุณล้มเหลวเนื่องจากคุณกำลังทำอะไรที่นี่:

myArray  :=[...]int{11,12,14} //error pointing on this line 

เป็นอีกครั้งที่การประกาศที่มีอยู่ myArray ตัวแปรที่แล้วมีค่าจำนวนเต็ม

ใช้งานได้:

myArray = [...]int{11,12,14} // NO error will be produced by this line

เนื่องจากเป็นการกำหนดอาร์เรย์จำนวนเต็มให้กับตัวแปร (ประกาศล่วงหน้า / เริ่มต้น) ที่มีอยู่

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