コードを見てください - 出力はどうなると思いますか?それは "Second"の代わりに "Third"を返し、なぜか理解するために私をしばらく捉えました。GoLang:for-rangeでの値の参照が厄介なケース
あなたは理由を知っていますか?
私は値渡し&の概念をかなりよく受け取りましたが、このケースはPythonのような言語から来た人にとってはやや難解です。だから私はそれを共有する価値があると決めました。それはオンラインチェックする
package main
import "fmt"
type Record struct {
Id int
Name string
}
var records = []Record{
Record{1, "First"},
Record{2, "Second"},
Record{3, "Third"},
}
func findRecod(id int) (foundRecord *Record) {
for _, record := range records {
if record.Id == id {
foundRecord = &record
// You think we can do a break here but imagine we need to do...
}
// ...something more here
}
return foundRecord
}
func main() {
foundRecord := findRecod(2)
if foundRecord == nil {
fmt.Println("Nothing found")
} else {
fmt.Println("Found: ", foundRecord.Name)
}
}
ランは:https://play.golang.org/p/Y_iAl6m7Ms
私は何が起こっているのを考え出すいくつかの時間を費やしてきました。
私はdownvoteなかった –
。あなたはダウン投票した場合、私はコメントで理由をお知らせください。:(ダウンは、投票した。しかし、そのせいか「期待していたものを返すのではなく、その理由を説明できますか」ということで、あなたが期待したことを説明していないので、バグタイプの質問が見つかるようです。 –
@AH 、おかげで、 "see-my-code-find-the-bug"ではないことをより明確にするために投稿を編集しました。 –