当前位置: 首页 > 面试题库 >

我无法在追加到数组后修改项目

暨承平
2023-03-14
问题内容

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

这是我的结构和方法:

RoomManager结构

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)
}

问题答案:

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

Rooms []*Room

您还需要定义函数以获取指针值,如下所示

func(room *Room) {}

详细说明。Go是按值传递。每当您从原始切片之一中拉出某些东西并将其传递给您的功能之一时,它都会得到一个副本。使用指针会修改切片中的实际值。

请参阅此示例。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
}


 类似资料:
  • 问题内容: 在名为News的模型中 在Javascript中,我将AJAX post方法与formdata一起使用。我要设置这个区域。 上面我在JS中编写的代码是这样设置的 和上面的代码我将进入控制器。但是,尽管至少我选择了两个区域,但它始终返回0条记录。 我的Ajax方法在上面。我在哪里犯错? 提前致谢。 问题答案: 如果您用于发送数据,则需要将每个单独的名称/值发送给。由于它是一个集合,因此您

  • 我有一个for循环,它遍历CSV中的每一行,我创建了一个包含列表的字典,但是列表被重写了,因为字典键被重复了几次。我如何总结或追加到列表中的第二(1)位置相同的键的下一个值下一个循环迭代? 因为使用append时,如果再次找到现有键,则会覆盖该值,因此该键的值会被一次又一次地覆盖。 CSV中的字段包括: 输出应该是这样的:

  • 问题内容: 我有以下代码试图对数组的值进行规范化(它将用作神经网络的输入,其中,训练示例的数量和特征的数量)。 但是,当脚本运行后在解释器中检查数组时,我看到值未标准化;因此,请参见图9。也就是说,它们仍然具有原始值。我猜这是因为对函数内部变量的赋值仅在函数内部可见。 我该如何进行规范化?还是我必须从normalize函数返回一个新数组? 问题答案: 如果你想数学运算适用于就地一个numpy的数组

  • 我试图通过FXML文件将项目添加到组合框中,但出现了这个错误。 这是我的FXML 主要 当我通过scene builder打开它时,会出现这个错误 我已经仔细检查过了,但代码似乎没问题。当我删除试图添加到FXML的值时,错误消失了,但我的组合框变为空。它说String不是有效的类型。我怎样才能解决这个问题?为什么它是无效的?我在这里检查了类似的问题,但是错误是由于没有导入FXCollections

  • 我想使用swig从C附加到Javabyte[]。诀窍是在不调用GetByteArrayElements的情况下执行此操作,因为如果无法固定byte[],这将生成byte[]的副本。 没有swig,我们可以使用SetByteArrayArea轻松做到这一点-直接将字节数写入byte[]。swg的问题是: > 执行实际工作的代码在. cpp中-例如读取文件的内容并将其放入字符串fileContents

  • 问题内容: 如果我有一个ArrayList,并向其中添加了一个对象,后来又修改了该对象,此更改是否会反映在ArrayList中?还是将对象添加到ArrayList时,Java创建了一个副本并将其添加到ArrayList? 如果将对此对象的引用更改为null怎么办?这是否意味着ArrayList中的对象现在也为空? 问题答案: 这个变化会反映在ArrayList中吗? 是的,因为您在列表中添加了对该