When making a contract transaction using go-ethereum (golang) how can I decode the transaction inputs. 

Specifically 
Given a `tx.Data []byte` , the contract's `contractABI abi.ABI` and the method that is being called its `methodID string` how can I decode `tx.Data` from hexadecimal to go types ? 

I've tried doing `abi.Methods[methodID].Inputs.Arguments.UnpackValues(tx.Data)`  but this always results in an empty slice of values. 


Code:

```
func decodeTxParams(abi abi.ABI, method string, data []byte) ([]interface{}, error) {
	txParams, err := abi.Methods[method].Inputs.UnpackValues(data)
	if err != nil {
		return []interface{}{}, err
	}
	return txParams, nil
}
```

caller: 

```
func (b *backend) SendTransaction(ctx context.Context, tx *types.Transaction) error {
	err := b.Client.SendTransaction(ctx, tx)
	if err != nil {
		return err
	}

	// update local nonce
	msg, err := tx.AsMessage(types.HomesteadSigner{})
	if err != nil {
		return err
	}
	sender := msg.From()
	b.nonceManager.Lock(sender)
	b.nonceManager.Update(sender, tx.Nonce())
	b.nonceManager.Unlock(sender)

	data := msg.Data()
	method, ok := b.methods[string(data[:4])]
	if !ok {
		method = "unknown"
	}

		txParams, err := decodeTxParams(b.abiMap[string(data[:4])], string(data[:4]), data[4:])

	if err != nil {
		return err
	}

	if err != nil {
		glog.Infof("\n%vEth Transaction%v\n\nInvoking transaction: \"%v\".  \nTransaction Failed: %v\n\n%v\n", strings.Repeat("*", 30), strings.Repeat("*", 30), method, err, strings.Repeat("*", 75))
		return err
	}

	glog.Infof("\n%vEth Transaction%v\n\nInvoking transaction: \"%v\".  Hash: \"%v\". \n\n%v\n", strings.Repeat("*", 30), strings.Repeat("*", 30), method, tx.Hash().String(), strings.Repeat("*", 75))

	return nil
}
```