Go SDK - Simulating Transactions
Simulating transactions allows you to preview the cost and effect of submitting a transaction without paying fees. You can use this to estimate fees, test a transaction, or to check what the output might be.
To simulate a transaction, you must pass in a transaction and which account would be the signer:
// transfer_coin is an example of how to make a coin transfer transaction in the simplest possible waypackage main
import (  "fmt"
  "github.com/aptos-labs/aptos-go-sdk"  "github.com/aptos-labs/aptos-go-sdk/bcs")
const FundAmount = 100_000_000const TransferAmount = 1_000
// example This example shows you how to make an APT transfer transaction in the simplest possible wayfunc example(networkConfig aptos.NetworkConfig) {  // Create a client for Aptos  client, err := aptos.NewClient(networkConfig)  if err != nil {    panic("Failed to create client:" + err.Error())  }
  // Create accounts locally for alice and bob  alice, err := aptos.NewEd25519Account()  if err != nil {    panic("Failed to create alice:" + err.Error())  }  bob, err := aptos.NewEd25519Account()  if err != nil {    panic("Failed to create bob:" + err.Error())  }
  fmt.Printf("\n=== Addresses ===\n")  fmt.Printf("Alice: %s\n", alice.Address.String())  fmt.Printf("Bob:%s\n", bob.Address.String())
  // Fund the sender with the faucet to create it on-chain  err = client.Fund(alice.Address, FundAmount)  if err != nil {    panic("Failed to fund alice:" + err.Error())  }
  aliceBalance, err := client.AccountAPTBalance(alice.Address)  if err != nil {    panic("Failed to retrieve alice balance:" + err.Error())  }  bobBalance, err := client.AccountAPTBalance(bob.Address)  if err != nil {    panic("Failed to retrieve bob balance:" + err.Error())  }  fmt.Printf("\n=== Initial Balances ===\n")  fmt.Printf("Alice: %d\n", aliceBalance)  fmt.Printf("Bob:%d\n", bobBalance)
  // 1. Build transaction  accountBytes, err := bcs.Serialize(&bob.Address)  if err != nil {    panic("Failed to serialize bob's address:" + err.Error())  }
  amountBytes, err := bcs.SerializeU64(TransferAmount)  if err != nil {    panic("Failed to serialize transfer amount:" + err.Error())  }  rawTxn, err := client.BuildTransaction(alice.AccountAddress(), aptos.TransactionPayload{    Payload: &aptos.EntryFunction{      Module: aptos.ModuleId{        Address: aptos.AccountOne,        Name:    "aptos_account",      },      Function: "transfer",      ArgTypes: []aptos.TypeTag{},      Args: [][]byte{        accountBytes,        amountBytes,      },    }},  )
  if err != nil {    panic("Failed to build transaction:" + err.Error())  }
  // 2. Simulate transaction  // This is useful for understanding how much the transaction will cost  // and to ensure that the transaction is valid before sending it to the network  // This is optional, but recommended  simulationResult, err := client.SimulateTransaction(rawTxn, alice)  if err != nil {    panic("Failed to simulate transaction:" + err.Error())  }  fmt.Printf("\n=== Simulation ===\n")  fmt.Printf("Gas unit price: %d\n", simulationResult[0].GasUnitPrice)  fmt.Printf("Gas used: %d\n", simulationResult[0].GasUsed)  fmt.Printf("Total gas fee: %d\n", simulationResult[0].GasUsed*simulationResult[0].GasUnitPrice)  fmt.Printf("Status: %s\n", simulationResult[0].VmStatus)}
func main() {  example(aptos.DevnetConfig)}Look here to see the full example of how to build, simulate, and submit a transaction.
You can also learn how to simulate more advanced transactions by looking at the following guides: