I am not familiar with NAG, but I believe the following are useful pieces of advice:
1) You cannot pass a *mat64.Dense directly. Dense is a Go struct type, but you will want to just pass a pointer to the data itself.
2) You can see examples of doing this in the wrapping of BLAS using cgo. the package is
github.com/gonum/blas/cblas.
3) The data is in row-major order. The stride is the number of elements between the start to the row. data[i*stride +j] is how to access the (i, j) element of the implied matrix. Naively, one might expect that stride is equal to the number of columns, but this is not, in general, true because of taking a View of the matrix.
4) You can reconstruct a Dense by constructing the RawMatrix type yourself and using SetRawMatrix. There isn't an example of this directly, but you can look at the code for mat64.Dense.Mul to see the data from a Dense being sent to a blas routine.
5) Note that we do have a bunch of statistics functions already in
github.com/gonum/stat. In particular, there is a pull request in progress to compute a covariance matrix from a set of data. It isn't through yet, but it is close to being ready. It is also backed by BLAS so it should be fast. If there are other specific functions you need and feel would be a good fit to gonum, please feel free to file issues or write code for us. If you would like to write code, that is awesome, but please discuss changes on gonum-dev first to make sure we are all on the same page before a lot of code is written unnecessarily.