Write vector of struct with go

701 views
Skip to first unread message

mimu mimu

unread,
Jan 5, 2015, 3:01:04 AM1/5/15
to flatb...@googlegroups.com
Hello.
I have a problem with write vector of struct with Golang.

This is my fbs file definition.

namespace packets;

table User {
    uiid: string;
    name: string;
}

union PacketType {Ping, RoomInfo}

table Packet {
    packet: PacketType;
}

table Ping {
    timestamp: uint;
}

table RoomInfo {
    id: uint;
    users: [User];
}

root_type Packet;


This is my code write room info with c++

flatbuffers::FlatBufferBuilder builder;

auto user1 = CreateUser(builder, builder.CreateString("user1"), builder.CreateString("user1_uuid"));
auto user2 = CreateUser(builder, builder.CreateString("user2"), builder.CreateString("user2_uuid"));

flatbuffers::Offset<User> users[2];
users[0] = user1;
users[1] = user2;

auto vec = builder.CreateVector(users, 2);

RoomInfoBuilder rib(builder);
rib.add_id(100);
rib.add_users(vec);

auto packet = CreatePacket(builder, PacketType_RoomInfo, rib.Finish().Union());

builder.Finish(packet);

std::ofstream ofs("/tmp/roominfo.data", std::ios::out | std::ios::binary);
if (!ofs) {
    std::cout << "file open failed" << std::endl;
    return -1;
}

ofs.write((char*)builder.GetBufferPointer(), builder.GetSize());

ofs.close();


And I want to write RoomInfo with Golang.
This is Golang code i wrote without vector of struct.

builder := flatbuffers.NewBuilder(0)

// create user 1
packets.UserStart(builder)
packets.UserAddName(builder, builder.CreateString("user1"))
packets.UserAddUiid(builder, builder.CreateString("user1_uuid"))
user1 := packets.LoginEnd(builder)
builder.Finish(user1)

// create user 2
packets.UserStart(builder)
packets.UserAddName(builder, builder.CreateString("user2222"))
packets.UserAddUiid(builder, builder.CreateString("user2222_uuid"))
user2 := packets.LoginEnd(builder)
builder.Finish(user2)

/// write room info
packets.RoomInfoStart(builder)
packets.RoomInfoAddId(builder, 1000)

///
/// HOW to build vector of struct??
///

room := packets.RoomInfoEnd(builder)
builder.Finish(room)

packets.PacketStart(builder)
packets.PacketAddPacketType(builder, packets.PacketTypeRoomInfo)
packets.PacketAddPacket(builder, room)
p := packets.PacketEnd(builder)
builder.Finish(p)

ioutil.WriteFile("/tmp/roominfo.go.data", builder.Bytes[builder.Head():], os.FileMode(0644))


Please help me to complete this code.

Wouter van Oortmerssen

unread,
Jan 5, 2015, 8:20:03 PM1/5/15
to mimu mimu, flatb...@googlegroups.com
I'm not sure I follow the Go code, since it calls LoginEnd even though the table was started with UserStart. Also you call builder.Finish on each user, even though Builder.Finish is only intended for the root object (much like C++).

Besides that, constructing a vector works much like the example in the documentation, except that you have to call it with PrependUOffsetT instead of PrependByte.

--
You received this message because you are subscribed to the Google Groups "FlatBuffers" group.
To unsubscribe from this group and stop receiving emails from it, send an email to flatbuffers...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

mimu mimu

unread,
Jan 5, 2015, 9:59:15 PM1/5/15
to flatb...@googlegroups.com, litm...@gmail.com
Thank you for your response!
I've successfully completed my code like below.

builder := flatbuffers.NewBuilder(0)

// create user 1
packets.UserStart(builder)
packets.UserAddName(builder, builder.CreateString("user1"))
packets.UserAddUiid(builder, builder.CreateString("user1_uuid"))
user1 := packets.UserEnd(builder)

// create user 2
packets.UserStart(builder)
packets.UserAddName(builder, builder.CreateString("user2222"))
packets.UserAddUiid(builder, builder.CreateString("user2222_uuid"))
user2 := packets.UserEnd(builder)

// create vector
packets.RoomInfoStartUsersVector(builder, 2)
builder.PrependUOffsetT(user1)
builder.PrependUOffsetT(user2)
vec := builder.EndVector(2)

/// write room info
packets.RoomInfoStart(builder)
packets.RoomInfoAddId(builder, 1000)
packets.RoomInfoAddUsers(builder, vec)
room := packets.RoomInfoEnd(builder)
builder.Finish(room)

packets.PacketStart(builder)
packets.PacketAddPacketType(builder, packets.PacketTypeRoomInfo)
packets.PacketAddPacket(builder, room)
p := packets.PacketEnd(builder)
builder.Finish(p)

ioutil.WriteFile("/tmp/roominfo.go.data", builder.Bytes[builder.Head():], os.FileMode(0644))

Wouter van Oortmerssen

unread,
Jan 7, 2015, 1:51:16 PM1/7/15
to mimu mimu, flatb...@googlegroups.com
That looks better :)
Reply all
Reply to author
Forward
0 new messages