Generating new bson.ObjectId with a Specific timestamp.

For a project I'm working on, using the excellent mgo driver, I needed to be able to query the MongoDB collection by the ObjectId's timestamp.

And while I was inserting dummy data, I had no obvious way to generate a new unique ObjectId with a timestamp (the timestamp itself wasn't unique) so I wrote this little helper function.

Note that this function isn't the same as bson.NewObjectIdWithTime, bson.NewObjectIdWithTime works for generating a timestamp-only ObjectId that you can query the database with, but not for insertion.
Continue reading

The performance of using interface{} vs a specific type.

I've recently started learning Go, and I have to say I'm very amazed by the whole concept of Goroutines, specially coming from a NodeJS / C++ background.

But sometimes it's nice to have a variable with a dynamic type, which Go does support (aka interface{}) , then I started wondering about the performance of using it vs just using one specific type.

I wrote a simple benchmark, at first I was rather disappointed at how slow it was compared to using the direct type, then I tried using goroutines to speed it up, with both buffered and unbuffered channels, surprisingly it didn't help at all, it even slowed it down farther.

Since the benchmark is simply summing some numbers, I decided to try atomic.AddUint64(), and while it was a tiny bit slower for defined types, it was much faster using interface{}

Continue reading