diff --git a/go/table.go b/go/table.go
index <HASH>..<HASH> 100644
--- a/go/table.go
+++ b/go/table.go
@@ -26,7 +26,8 @@ func (t *Table) Indirect(off UOffsetT) UOffsetT {
 
 // String gets a string from data stored inside the flatbuffer.
 func (t *Table) String(off UOffsetT) string {
-	return string(t.ByteVector(off))
+	b := t.ByteVector(off)
+	return byteSliceToString(b)
 }
 
 // ByteVector gets a byte slice from data stored inside the flatbuffer.
diff --git a/go/unsafe.go b/go/unsafe.go
index <HASH>..<HASH> 100644
--- a/go/unsafe.go
+++ b/go/unsafe.go
@@ -43,3 +43,8 @@ var (
 	// SizeVOffsetT is the byte size of an VOffsetT.
 	SizeVOffsetT = int(unsafe.Sizeof(VOffsetT(0)))
 )
+
+// byteSliceToString converts a []byte to string without a heap allocation.
+func byteSliceToString(b []byte) string {
+	return *(*string)(unsafe.Pointer(&b))
+}
Fix heap allocation when reading a string.