假设有C的库libbsdiff.a,以下为该库的头文件:bsdiff_wrapper.h

#ifndef __BSDIFF_WRAPPER_H__
#define __BSDIFF_WRAPPER_H__ 1

int binary_file_diff(const char *old_path, const char *new_path, const char *patch_path, char *err_buff, int err_size);
int binary_file_patch(const char *old_path, const char *new_path, const char *patch_path, char *err_buff, int err_size);

#endif

以下为Go使用该库的代码:

package main

import (
	"fmt"
	"os"
	"unsafe"
	"strconv"
)

// #include <stdlib.h>
// #include "bsdiff_wrapper.h"
// #cgo LDFLAGS: -L.
// #cgo LDFLAGS: -lbz2
// #cgo LDFLAGS: -lbsdiff
import "C"

func main() {
	var (
		err string
		is_patch int
		ret C.int
	)

	argc := len(os.Args)
	if argc < 4 {
		fmt.Printf("Usage: %s <new> <old> <patch>\n", os.Args[0])
		return
	}
	if argc > 4 {
		is_patch, _ = strconv.Atoi(os.Args[4])
	}
	newfile_cs := C.CString(os.Args[1])
	oldfile_cs := C.CString(os.Args[2])
	patchfile_cs := C.CString(os.Args[3])
	err_cs := C.CString(err)
	if is_patch == 0 {
		ret = C.binary_file_diff(newfile_cs, oldfile_cs, patchfile_cs, err_cs, 1024)
	} else {
		ret = C.binary_file_patch(newfile_cs, oldfile_cs, patchfile_cs, err_cs, 1024)
	}
	if ret != 0 {
		fmt.Printf("%s\n", C.GoString(err_cs))
	}
	C.free(unsafe.Pointer(newfile_cs))
	C.free(unsafe.Pointer(oldfile_cs))
	C.free(unsafe.Pointer(patchfile_cs))
	C.free(unsafe.Pointer(err_cs))
}