You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.7 KiB
100 lines
3.7 KiB
Use in Go {#flatbuffers_guide_use_go}
|
|
=========
|
|
|
|
## Before you get started
|
|
|
|
Before diving into the FlatBuffers usage in Go, it should be noted that
|
|
the [Tutorial](@ref flatbuffers_guide_tutorial) page has a complete guide
|
|
to general FlatBuffers usage in all of the supported languages (including Go).
|
|
This page is designed to cover the nuances of FlatBuffers usage, specific to
|
|
Go.
|
|
|
|
You should also have read the [Building](@ref flatbuffers_guide_building)
|
|
documentation to build `flatc` and should be familiar with
|
|
[Using the schema compiler](@ref flatbuffers_guide_using_schema_compiler) and
|
|
[Writing a schema](@ref flatbuffers_guide_writing_schema).
|
|
|
|
## FlatBuffers Go library code location
|
|
|
|
The code for the FlatBuffers Go library can be found at
|
|
`flatbuffers/go`. You can browse the library code on the [FlatBuffers
|
|
GitHub page](https://github.com/google/flatbuffers/tree/master/go).
|
|
|
|
## Testing the FlatBuffers Go library
|
|
|
|
The code to test the Go library can be found at `flatbuffers/tests`.
|
|
The test code itself is located in [go_test.go](https://github.com/google/
|
|
flatbuffers/blob/master/tests/go_test.go).
|
|
|
|
To run the tests, use the [GoTest.sh](https://github.com/google/flatbuffers/
|
|
blob/master/tests/GoTest.sh) shell script.
|
|
|
|
*Note: The shell script requires [Go](https://golang.org/doc/install) to
|
|
be installed.*
|
|
|
|
## Using the FlatBuffers Go library
|
|
|
|
*Note: See [Tutorial](@ref flatbuffers_guide_tutorial) for a more in-depth
|
|
example of how to use FlatBuffers in Go.*
|
|
|
|
FlatBuffers supports reading and writing binary FlatBuffers in Go.
|
|
|
|
To use FlatBuffers in your own code, first generate Go classes from your
|
|
schema with the `--go` option to `flatc`. Then you can include both FlatBuffers
|
|
and the generated code to read or write a FlatBuffer.
|
|
|
|
For example, here is how you would read a FlatBuffer binary file in Go: First,
|
|
include the library and generated code. Then read a FlatBuffer binary file into
|
|
a `[]byte`, which you pass to the `GetRootAsMonster` function:
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.go}
|
|
import (
|
|
example "MyGame/Example"
|
|
flatbuffers "github.com/google/flatbuffers/go"
|
|
|
|
io/ioutil
|
|
)
|
|
|
|
buf, err := ioutil.ReadFile("monster.dat")
|
|
// handle err
|
|
monster := example.GetRootAsMonster(buf, 0)
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
Now you can access values like this:
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.go}
|
|
hp := monster.Hp()
|
|
pos := monster.Pos(nil)
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
|
|
In some cases it's necessary to modify values in an existing FlatBuffer in place (without creating a copy). For this reason, scalar fields of a Flatbuffer table or struct can be mutated.
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.go}
|
|
monster := example.GetRootAsMonster(buf, 0)
|
|
|
|
// Set table field.
|
|
if ok := monster.MutateHp(10); !ok {
|
|
panic("failed to mutate Hp")
|
|
}
|
|
|
|
// Set struct field.
|
|
monster.Pos().MutateZ(4)
|
|
|
|
// This mutation will fail because the mana field is not available in
|
|
// the buffer. It should be set when creating the buffer.
|
|
if ok := monster.MutateMana(20); !ok {
|
|
panic("failed to mutate Hp")
|
|
}
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
The term `mutate` is used instead of `set` to indicate that this is a special use case. All mutate functions return a boolean value which is false if the field we're trying to mutate is not available in the buffer.
|
|
|
|
## Text Parsing
|
|
|
|
There currently is no support for parsing text (Schema's and JSON) directly
|
|
from Go, though you could use the C++ parser through cgo. Please see the
|
|
C++ documentation for more on text parsing.
|
|
|
|
<br>
|