remix里写一个合约作为示例
pragma solidity^0.8;
contract calldemo{
    uint256 count;
    constructor() public {
        count = 2022;
    }
    function setCount(uint256 _count) external {
        count =  _count;
    }
    function getCount() public view returns (uint256){
        return count;
    }
}
编译后复制abi信息
新建目录,在目录中新建abi文件,将abi信息存入文件calldemo.abi中
执行
abigen -abi calldemo.abi -type calldemo -pkg main -out calldemo.go
其中参数含义如下
-abi:指定传入的abi文件
-type:指定输出文件中基本结构类型
-pkg:指定输出文件package名称
-out:指定输出文件名
在本地开启节点
geth --datadir ./data --networkid 18 --port 30303 --http --http.addr 0.0.0.0 --http.vhosts "*" --http.api "db,net,eth,web3,personal" --http.corsdomain "*" --snapshot=false --mine --miner.threads 1 --http.port 8545 --miner.gasprice 0 --allow-insecure-unlock console 2> 1.log
将合约部署到本地节点,拿到合约地址
选择web3 provider环境,地址为本地8545端口
package main   
import (
    "fmt"
    "log"
    "github.com/etherum/go-ethereum/common"
    "github.com/etherum/go-etherum/ethclient"
)
func main() {
    conn,err := ethclient.Dial("http://localhost:8545")
    if err!= nil {
        log.Fatalf("Failed to connect to etherum client: %v",err)
    }
    defer conn.Close()
    demonIns, err := newCalldemo(common.HexToAddress("合约地址"),conn)
  if err != nil {
    log.Fatalf("Failed to NewCalldemo : %v",err)
  }
  
  val, err := demoIns.GetCount(nil)
  if err != nil {
    log.Fatalf("Failed to GetCount: %v", err)
  }
  fmt.Println(val)
}
此时可以通过调用函数GetCount()
其中传参值代表身份信息,这里不需要消耗gas所以可以传个nil