假设有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))
}