# Aerospike Go Client Release 2.0.0 (March 20, 2019)

**URL:** <https://discuss.aerospike.com/t/aerospike-go-client-release-2-0-0-march-20-2019/6040>\
**Category:** Releases (Server, Client & Tools)\
**Created:** [March 20, 2019, 9:48pm UTC](https://discuss.aerospike.com/t/aerospike-go-client-release-2-0-0-march-20-2019/6040 "2019-03-20T21:48:46Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![mcoberly](https://sea1.discourse-cdn.com/flex019/user_avatar/discuss.aerospike.com/mcoberly/32/637_2.png) [@mcoberly](https://discuss.aerospike.com/u/mcoberly)\
**Post date:** [March 20, 2019, 9:48pm UTC](https://discuss.aerospike.com/t/aerospike-go-client-release-2-0-0-march-20-2019/6040/1 "2019-03-20T21:48:46Z")

</div>

[Aerospike Go client version 2.0.0](http://www.aerospike.com/download/client/go/notes.html#2.0.0) was released on March 20, 2019.

This is the first major breaking release of the Aerospike Go Client in 5 years.

Most breaking changes are minor and specific, and will either not hit you, or will be fixable with relative ease.

The only major change is that the behavior of the client when a key does not exist has changed.  
It used to return no errors, but a `nil` `Record.Bins`. Now it returns `ErrKeyNotFound` error.  
This is a significant change, and you should search your code for all instances of `.Bins == nil` (or equivalent) and adapt the code accordingly.

#### Breaking Changes

- `Get`/`Put`/`Touch`/`Operate` and `ExecuteUDF` commands will return an `ErrKeyNotFound` error when the key does not exist in the database. The old behavior used to be not to return an error, but have an empty `Record.Bins`.
- Renames `Statement.Addfilter` to `Statement.SetFilter`, changes the name and type of `Statement.Filters` to `Statement.Filter`.
- Remove `ClientPolicy.RequestProleReplicas`. The client will always request them.
- Removes `ScanPolicy.ServerSocketTimeout` and `QueryPolicy.ServerSocketTimeout` in favor of the already existing `Policy.SocketTimeout`.
- Renames `Policy.Timeout` to `Policy.TotalTimeout` to make the naming consistent with other clients.
- Moves `atomic` package to internal.
- Moves `ParticleType` package to internal.
- Moves `RequestNodeInfo` and `RequestNodeStats` to methods on Node object, and adds `InfoPolicy` to the relevant API signatures.
- Removes `WaitUntilMigrationIsFinished` from `Scan`/`Query` policies.
- Changes `NewConnection` method signature
- Makes `LoginCommand` private.
- Makes `OperationType` private.
- Remove long deprecated method for pool management.
- Removes unused `ReadN` method in `Connection`.
- Embeds Policies as values and not pointers inside `MultiPolicy`, `ScanPolicy`, `QueryPolicy`

#### Improvements

- Optimizes connection creation out of the transaction pipeline and makes it async.
- Puts a threshold on the number of connections allowed to open simultaneously. Controlled via `ClientPolicy.OpeningConnectionThreshold`.
- Do not clear partition map entry when a node reports that it no longer owns that partition entry.
- Uses rolling timeout instead of strict timeout for connections. This means that every time a connection is read, the timeout is set to `policy.SocketTimeout` again, unless it will take longer than the whole transaction `TotalTimeout`.
- Remove `ToValueArray` and `ToValueSlice` methods to discourage such sub-optimal use. Changes `QueryAggregate` signature to remove the need for those methods.
- Remove unnecessary conversion from `BinMap` to `Bin`s in reflection API to speed up the command and avoid unnecessary memory allocations.
- Use shorter intervals with exponential back-off for tasks.
- Fixes a race condition in the `AdminCommand`.
- Synchronize the `XORShift` to avoid race conditions.
- Completely removes deprecated LDT code.
