I am looking to convert a string array to a byte array in GO so I can write it down to a disk. What is an optimal solution to encode and decode a string array ([]string
) to a byte array ([]byte
)?
I was thinking of iterating the string array twice, first one to get the actual size needed for the byte array and then a second one to write the length and actual string ([]byte(str)
) for each element.
The solution must be able to convert it the other-way; from a []byte
to a []string
.
Byte objects are sequence of Bytes, whereas Strings are sequence of characters. Byte objects are in machine readable form internally, Strings are only in human readable form. Since Byte objects are machine readable, they can be directly stored on the disk.
So how to convert String array to String in java. We can use Arrays. toString method that invoke the toString() method on individual elements and use StringBuilder to create String. We can also create our own method to convert String array to String if we have some specific format requirements.
How to convert String to byte[] in Java? In Java, we can use str. getBytes(StandardCharsets. UTF_8) to convert a String into a byte[] .
Lets ignore the fact that this is Go for a second. The first thing you need is a serialization format to marshal the []string
into.
There are many option here. You could build your own or use a library. I am going to assume you don't want to build your own and jump to serialization formats go supports.
In all examples, data is the []string
and fp is the file you are reading/writing to. Errors are being ignored, check the returns of functions to handle errors.
Gob is a go only binary format. It should be relatively space efficient as the number of strings increases.
enc := gob.NewEncoder(fp) enc.Encode(data)
Reading is also simple
var data []string dec := gob.NewDecoder(fp) dec.Decode(&data)
Gob is simple and to the point. However, the format is only readable with other Go code.
Next is json. Json is a format used just about everywhere. This format is just as easy to use.
enc := json.NewEncoder(fp) enc.Encode(data)
And for reading:
var data []string dec := json.NewDecoder(fp) dec.Decode(&data)
XML is another common format. However, it has pretty high overhead and not as easy to use. While you could just do the same you did for gob and json, proper xml requires a root tag. In this case, we are using the root tag "Strings" and each string is wrapped in an "S" tag.
type Strings struct { S []string } enc := xml.NewEncoder(fp) enc.Encode(Strings{data}) var x Strings dec := xml.NewDecoder(fp) dec.Decode(&x) data := x.S
CSV is different from the others. You have two options, use one record with n rows or n records with 1 row. The following example uses n records. It would be boring if I used one record. It would look too much like the others. CSV can ONLY hold strings.
enc := csv.NewWriter(fp) for _, v := range data { enc.Write([]string{v}) } enc.Flush()
To read:
var err error var data string dec := csv.NewReader(fp) for err == nil { // reading ends when an error is reached (perhaps io.EOF) var s []string s, err = dec.Read() if len(s) > 0 { data = append(data, s[0]) } }
Which format you use is a matter of preference. There are many other possible encodings that I have not mentioned. For example, there is an external library called bencode. I don't personally like bencode, but it works. It is the same encoding used by bittorrent metadata files.
If you want to make your own encoding, encoding/binary is a good place to start. That would allow you to make the most compact file possible, but I hardly thing it is worth the effort.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With