go.uuid icon indicating copy to clipboard operation
go.uuid copied to clipboard

uuid.Value []byte vs string

Open danilobuerger opened this issue 7 years ago • 9 comments

Is there a particular reason why uuid.Value returns a string instead of a []byte?

danilobuerger avatar Oct 07 '16 20:10 danilobuerger

I assume it's just to make it readable when storing it in a database, else you'd be storing it as a blob.

danhardman avatar Oct 08 '16 17:10 danhardman

What if i want to store it as a 16 byte blob instead of a 36 byte string?

danilobuerger avatar Oct 08 '16 17:10 danilobuerger

Typically, UUIDs are used as a client provided value to reference some unique record. So you'll typically receive it as a string. It makes sense to store it as such to avoid having to do any type conversion

danhardman avatar Oct 08 '16 17:10 danhardman

It doesn't really matter how it is received as this library stores it in a 16 byte array. So even if I did receive it as a string from a client, it would then be a 16 byte array after calling FromString.

Point is: I can scan it from either a 16 byte slice, a text byte slice or a string. When valuing it, I should have the same options. If it came from the database as a 16 byte slice, I would assume being able to put it back like that.

danilobuerger avatar Oct 08 '16 17:10 danilobuerger

Fair point. I was worried manually querying blob data in a MySQL database for example would be fiddly but it seems MySQL will cast strings to binary in queries. Not sure about other databases though...

danhardman avatar Oct 08 '16 18:10 danhardman

Postgres handles this fine as well. You can exec / query with either string or byte array. On the console, it displays the UUID type as a string.

danilobuerger avatar Oct 08 '16 18:10 danilobuerger

@danilobuerger @danhardman See initial discussion in #5 I never tested since if lib/pq supports binary protocol.

satori avatar Oct 09 '16 10:10 satori

@satori Thanks for the link. Support for binary protocol in lib/pq was added here: https://github.com/lib/pq/pull/357. It is a bit annoying to always call Bytes(). Maybe there is a better solution while providing backward compatibility for people relying on it to be a string?

danilobuerger avatar Oct 09 '16 11:10 danilobuerger

@danilobuerger What is the downside to just rolling your own struct composition and overriding Value()?

BourgeoisBear avatar Dec 26 '17 12:12 BourgeoisBear