Go offers it through cipher.NewGCM. It needs a unique nonce per message and can bind extra data (AAD), such as a record id, to the ciphertext.