代码之家  ›  专栏  ›  技术社区  ›  muthermutton

为什么我的切片在追加时没有更新?[重复]

  •  -1
  • muthermutton  · 技术社区  · 3 年前

    我试图在结构中附加一个切片,但它根本不会更新。我知道go主要是通过值传递的,但片不是已经指向底层数组了吗?

    我甚至尝试过通过我的change函数(使用指针?)传递这些值但我还是得到了同样的结果。

    package main
    
    import "fmt"
    
    type BookingInfoNode struct {
        Car         string
        Date        string
        BookingTime int
    }
    
    type user struct {
        Username     string
        UserBookings []*BookingInfoNode
    }
    
    var mapUsers = make(map[string]user)
    
    func init() {
        mapUsers["john"] = user{"john", []*BookingInfoNode{}}
    }
    
    func change(a []*BookingInfoNode, booking *BookingInfoNode) []*BookingInfoNode {
        a = append(a, booking)
        return a
    }
    
    func main() {
        newBooking := &BookingInfoNode{"mazda", "03/06/2022", 0600}
        myUser := mapUsers["john"]
        myUser.UserBookings = change(myUser.UserBookings, newBooking)
    
        fmt.Println(myUser.UserBookings)
        fmt.Println(mapUsers["john"].UserBookings)
    }
    
    

    用我的两张照片,我期待着:

    [memory address]
    [memory address]
    

    但我得到了:

    [memory address]
    []
    
    1 回复  |  直到 3 年前
        1
  •  0
  •   Burak Serdar    3 年前

    你的追加通话正常。但是你忘了用附加值更新地图。

    地图 map[string]user user 结构作为其值,因此 myUser:=mapUsers["john"] 分配一份 使用者 在地图上 myUser .您继续将 我的用户 ,但地图中的副本永远不会更新。

    要么把地图改成 map[string]*user ,或在更改地图后将值写回地图: mapUsers["john"]=myUser