มันจะสะดวกที่จะพูดอะไรเช่น:
for _, element := reverse range mySlice {
...
}
มันจะสะดวกที่จะพูดอะไรเช่น:
for _, element := reverse range mySlice {
...
}
คำตอบ:
ไม่มีตัวดำเนินการที่สะดวกสำหรับสิ่งนี้ที่จะเพิ่มลงในช่วงหนึ่งในสถานที่ คุณจะต้องทำแบบปกติสำหรับการนับถอยหลังแบบวนซ้ำ:
s := []int{5, 4, 3, 2, 1}
for i := len(s)-1; i >= 0; i-- {
fmt.Println(s[i])
}
คุณยังสามารถทำ:
s := []int{5, 4, 3, 2, 1}
for i := range s {
fmt.Println(s[len(s)-1-i]) // Suggestion: do `last := len(s)-1` before the loop
}
เอาท์พุต:
1
2
3
4
5
การเปลี่ยนแปลงด้วยดัชนี
for k := range s {
k = len(s) - 1 - k
// now k starts from the end
}
วิธีใช้ defer:
s := []int{5, 4, 3, 2, 1}
for i, _ := range s {
defer fmt.Println(s[i])
}
defer
แต่ฉันเชื่อว่าการใช้สิ่งนี้ภายในลูปสำหรับการย้อนกลับนั้นค่อนข้างยุ่งยากและควรใช้ความจำที่ไม่ได้ผล
defer
ในลักษณะที่ไม่ได้มีไว้สำหรับ อย่าใช้สิ่งนี้เนื่องจากอาจมีผลข้างเคียงที่น่ารังเกียจ (ไม่อยู่ในการดำเนินการตามคำสั่ง) เพียงใช้for
ลูปในคำตอบที่ยอมรับ Go มีเป้าหมายที่จะลดการแฮ็ก (ไม่) ฉลาดประเภทนี้ให้น้อยที่สุดเนื่องจากพวกเขามักจะกัดคุณในภายหลัง
หนึ่งสามารถใช้ช่องเพื่อย้อนกลับรายการในฟังก์ชันโดยไม่ต้องทำซ้ำ มันทำให้รหัสดีขึ้นในความหมายของฉัน
package main
import (
"fmt"
)
func reverse(lst []string) chan string {
ret := make(chan string)
go func() {
for i, _ := range lst {
ret <- lst[len(lst)-1-i]
}
close(ret)
}()
return ret
}
func main() {
elms := []string{"a", "b", "c", "d"}
for e := range reverse(elms) {
fmt.Println(e)
}
}
[]interface{}
? เนื่องจากreverse
ฟังก์ชันปัจจุบันรองรับเฉพาะสตริง
func reverse(lst []interface{}) chan inyterface{}
จะไม่ใช้สตริง [] เป็นอินพุตอีกต่อไป แม้ว่าจะสามารถแคสต์สตริงในอินเทอร์เฟซ {} ได้ แต่ [] ก็ไม่สามารถแคสต์ใน [] อินเทอร์เฟซ {} ได้ น่าเสียดายที่ฟังก์ชันย้อนกลับปัจจุบันเป็นฟังก์ชันที่ต้องเขียนใหม่เป็นจำนวนมาก
เมื่อฉันต้องการแยกองค์ประกอบจากชิ้นส่วนและช่วงย้อนกลับฉันใช้รหัสนี้:
// reverse range
// Go Playground: https://play.golang.org/p/gx6fJIfb7fo
package main
import (
"fmt"
)
type Elem struct {
Id int64
Name string
}
type Elems []Elem
func main() {
mySlice := Elems{{Id: 0, Name: "Alice"}, {Id: 1, Name: "Bob"}, {Id: 2, Name: "Carol"}}
for i, element := range mySlice {
fmt.Printf("Normal range: [%v] %+v\n", i, element)
}
//mySlice = Elems{}
//mySlice = Elems{{Id: 0, Name: "Alice"}}
if last := len(mySlice) - 1; last >= 0 {
for i, element := last, mySlice[0]; i >= 0; i-- {
element = mySlice[i]
fmt.Printf("Reverse range: [%v] %+v\n", i, element)
}
} else {
fmt.Println("mySlice empty")
}
}
เอาท์พุต:
Normal range: [0] {Id:0 Name:Alice}
Normal range: [1] {Id:1 Name:Bob}
Normal range: [2] {Id:2 Name:Carol}
Reverse range: [2] {Id:2 Name:Carol}
Reverse range: [1] {Id:1 Name:Bob}
Reverse range: [0] {Id:0 Name:Alice}
สนามเด็กเล่น: https://play.golang.org/p/gx6fJIfb7fo