arrays - 附加到数组后我无法修改该项目

标签 arrays pointers go struct

我正在为 Unity 引擎开发多人游戏 API。我有 Room 和 RoomManager 结构。当我想创建房间时,我设置房间名称、id(所有变量),然后我将这个新房间附加到 RoomManager 结构中的 allRoom 数组。之后,当我修改为 room 变量时,我无法更改任何变量。我不知道为什么?

这是我的结构和方法:

房间管理器结构

type RoomManager struct {
   allRooms    []Room
   roomCounter int
}

房间结构

type Room struct {
   tag               string
   name              string
   password          string
   id                int
   cappacity         int
   maxVariableCount  int
   userList          []User
   roomVariables     []RoomVariable
   extensionHandlers []ExtensionRequest
   InitializeMethod  roomInitializeFunc
}

房间创建方法

func (roomManager *RoomManager) CreateRoom(settings RoomSettings, arwServer *ARWServer) *Room {

   var newRoom Room
   newRoom.InitializeMethod = settings.InitializeMethod

   newRoom.name = settings.name
   newRoom.password = settings.password
   newRoom.tag = settings.tag
   newRoom.cappacity = settings.cappacity
   newRoom.maxVariableCount = settings.maxRoomVariableCount

   newRoom.id = roomManager.roomCounter
   roomManager.roomCounter++

   newRoom.userList = make([]User, 0, newRoom.cappacity)
   newRoom.roomVariables = make([]RoomVariable, 0, newRoom.maxVariableCount)

   if newRoom.InitializeMethod != nil {
     newRoom.InitializeMethod(arwServer, &newRoom)
   }

   roomManager.allRooms = append(roomManager.allRooms, newRoom)
   return &newRoom
}

将用户添加到房间

func (room *Room) AddUserToRoom(arwServer *ARWServer, u User) {
   room.userList = append(room.userList, u)

   var arwObj ARWObject

   arwObj.requestName = Join_Room
   arwObj.eventParams.PutString("RoomName", room.name)
   arwObj.eventParams.PutString("RoomTag", room.tag)
   arwObj.eventParams.PutInt("RoomId", room.id)
   arwObj.eventParams.PutInt("RoomCappacity", room.cappacity)

   usersData := ""
   for ii := 0; ii < len(room.userList); ii++ {
     if room.userList[ii].name != u.name {
       usersData += room.userList[ii].GetDataForOtherUser(u) + "''"
     }
   }

   usersData = strings.TrimRight(usersData, "''")

   arwObj.eventParams.PutString("Users", usersData)
   arwServer.SendRequestToUser(u, arwObj)

   var arwObjforTheOthers ARWObject
   arwObjforTheOthers.requestName = User_Enter_Room
   arwObjforTheOthers.eventParams.PutString("RoomName", room.name)
   arwObjforTheOthers.eventParams.PutString("userName", u.name)
   arwObjforTheOthers.eventParams.PutInt("userId", u.id)
   arwObjforTheOthers.eventParams.PutString("isMe", "false")

   room.SendRequestAllUserWithoutMe(*arwServer, arwObjforTheOthers, u)
   fmt.Println("User join Room - User Name : ", u.name+" Room : "+u.lastRoom.name)
}

最佳答案

您的问题是您的结构具有非指针 slice 。在你所有的结构中,将你的 slice 定义为像这样的指针 slice

Rooms []*Room

你还需要定义你的函数来获取指针值,就像这样

func(room *Room) {}

详细说明。 Go 是按值传递的。任何时候你从你的一个原始 slice 中提取一些东西并将它传递给你的一个函数,它都会得到一个副本。使用指针修改 slice 中的实际值。

请参阅此示例。 https://play.golang.org/p/ZThHrP0pds

package main

import (
    "fmt"
)

type Thing struct {
    Name string
}

func main() {
    things := []Thing{}
    thing := Thing{"thing1"}

    // add to slice
    // note that this is a function call
    things = append(things, thing)

    // attempt to change
    thing.Name = "thing2"
    fmt.Println(things[0].Name) // prints thing1
    fmt.Println(thing.Name)     // prints thing2

    fmt.Println("------")

    // try again
    thing3 := things[0]
    thing3.Name = "thing3"
    // fail again
    fmt.Println(things[0].Name) // prints thing1
    fmt.Println(thing3.Name)     // prints thing3

    fmt.Println("------")

    // do this instead
    betterThings := []*Thing{} // slice of pointers
    betterThing := &Thing{"thing2"} // betterThing is of type *Thing

    // add to slice
    betterThings = append(betterThings, betterThing)

    // successfully change
    betterThing.Name = "thing2"

    fmt.Println(betterThings[0].Name) // prints thing2
    fmt.Println(betterThing.Name)     // prints thing2
}

关于arrays - 附加到数组后我无法修改该项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43922965/

相关文章:

Javascript 纸牌游戏 - 随机选择后替换数组项

arrays - 将单个变量分配给数组(就地)

c++ - 如果 map 的键是指向字符串的指针,是否可以使用 unordered::map::find?

c - 为什么我的 C 代码不能使用指针和结构体工作?

windows - 在 Windows 上的 Go 中通过 telnet/ssh 写入现有的 tcp 套接字

java - StringBuffer 的替换方法无法正常工作

python - 值错误: too many boolean indices for a n=600 array (float)

c# - 在 C# 中传递和存储指向不可变类型和字符串的指针

go - 如何在 Go playground 中定义不同的文件或包?

go - channel 以死锁结束的范围