Go言語では、for range ループで取得した item は元のスライスの要素のコピーです。これにより、item を直接変更しても元のリストの要素に反映されません。そのため、ポインタ経由でアクセスして変更する必要があります。
ポインタと値の操作: item がリスト内の要素をポインタ経由で取得している場合、item を変更しても元のリストの要素が変更されることがありますが、それ以外の場合はそのような自動的な反映は行われません。必要に応じて、&item を使用してポインタ経由でアクセスし、リスト内の要素を直接変更します。
スライスと範囲ループの挙動: Go言語では、for range ループで取得した item は元のスライスの要素のコピーです。これにより、item を直接変更しても元のリストの要素に反映されません。そのため、ポインタ経由でアクセスして変更する必要があります。
失敗例
var estimatedStartTime time.Time
var estimatedMovingTime time.Duration
var estimatedStayTime time.Duration
for i, item := range list {
if i == 0 {
estimatedStartTime = estimated_Start_Time(data, item.destination) // 出発時刻(リアル時間)
fmt.Println("i=0のitem.destination:", item.destination)
fmt.Println("i=0のestimatedStartTime:", estimatedStartTime)
item.dep_time = estimatedStartTime // 時刻 (記録用)
fmt.Println("in i=0 item.dep_time:", item.dep_time)
} else {
item.dep_time = estimatedStartTime.Add(estimatedMovingTime + estimatedStayTime)
}
fmt.Println("===================>", item.dep_time)
estimatedMovingTime = estimated_Moving_Time(item.ox, item.oy, item.dx, item.dy) // 移動時間(間隔)
fmt.Println("estimatedMovingTime:", estimatedMovingTime)
estimatedStayTime = estimated_Stay_Time(data, item.destination) // 滞在時間(間隔)
fmt.Println("estimatedStayTime:", estimatedStayTime)
// item.dep_time = estimatedStartTime // 時刻 (記録用)
item.stay_time = estimatedStayTime // 滞在時間(間隔) (記録用)
if i+1 < len(list) {
fmt.Println("in 558", estimatedStartTime, item.dep_time)
nextItem := &list[i+1]
nextItem.dep_time = estimatedStartTime.Add(estimatedMovingTime + estimatedStayTime) // 次の出発時刻 = 現在の出発時刻 + 移動時間
fmt.Println("After nextItem.dep_time:", nextItem.dep_time)
fmt.Println("in 562", estimatedStartTime, item.dep_time)
}
//fmt.Println("in 565", estimatedStartTime, item.dep_time)
}
for i, item := range list {
fmt.Println(i, "item.dep_time:", item.dep_time)
fmt.Println(i, "item.stay_time:", item.stay_time)
fmt.Println(i, "item:", item)
//fmt.Println(i, "item.dep_time:", item.dep_time.Format("2006-01-02 15:04:05"))
}
成功例
var estimatedStartTime time.Time
var estimatedMovingTime time.Duration
var estimatedStayTime time.Duration
for i := range list {
if i == 0 {
estimatedStartTime = estimated_Start_Time(data, list[i].destination)
fmt.Println("i=0のitem.destination:", list[i].destination)
fmt.Println("i=0のestimatedStartTime:", estimatedStartTime)
list[i].dep_time = estimatedStartTime
fmt.Println("in i=0 item.dep_time:", list[i].dep_time)
} else {
// 前のアイテムの出発時刻に移動時間と滞在時間を加えて計算
list[i].dep_time = list[i-1].dep_time.Add(estimatedMovingTime + estimatedStayTime)
}
// 移動時間と滞在時間を計算する
estimatedMovingTime = estimated_Moving_Time(list[i].ox, list[i].oy, list[i].dx, list[i].dy)
fmt.Println("estimatedMovingTime:", estimatedMovingTime)
estimatedStayTime = estimated_Stay_Time(data, list[i].destination)
fmt.Println("estimatedStayTime:", estimatedStayTime)
// 滞在時間を記録用に設定する
list[i].stay_time = estimatedStayTime
fmt.Println("===================>", list[i].dep_time)
}
for i := range list {
fmt.Println(i, "item.dep_time:", list[i].dep_time)
fmt.Println(i, "item.stay_time:", list[i].stay_time)
fmt.Println(i, "item:", list[i])
}
}
そんな仕様、知るかーーーー