Sebelumnya kita telah membahas pengunaan kode c di golang dalam satu file, dimana kita membuat fungsi program C yang kemudian dipanggil di dalam kode program Golang. Tapi cara tersebut agak sulit jika kita akan membuat sebuah program yang lebih kompleks dan membutuhkan penulisan kode yang cukup banyak.

Cara ini memudahkan jika kita pernah menuliskan program dalam bahasa C dan ingin merefactor kode program kita ke dalam bahasa Golang, tapi kita tidak ingin menuliskan semua kodenya atau tidak bisa ditulis kembali di Golang.

Mempersiapkan kode C

Untuk memulai buat folder utama bernama PakaiC kemudian di dalamnya buat folder tersendiri (folder libKodeC) dengan berisikan file kodeC.h dan kodeC.c.

Untuk file kodeC.h berisi kode berikut:

#ifndef KODEC_H
#define KODEC_H

void halo();
int tambah(int a, int b);
void tampilPesan(char* pesan);
#endif

Dan untuk kodeC.c berisi kode berikut:

#include <stdio.h>
#include "kodeC.h"

void halo() {
    printf("Halo dari C !\n");
}

int tambah(int a, int b) {
    return a+b;
}

void tampilPesan(char* pesan) {
    printf("Golang mengirimkan pesan : %s\n", pesan);
}

Setelah source kode C siap, buka folder PakaiC menggunakan terminal dan kompile kode program C yang telah kita tulis dengan perintah.

gcc -c libKodeC/*.c

Dan buat arsip dari kode yang dikompile dengan perintah:

ar rs kodeC.a *.o

Menggunakan Arsip Librari C di GO

Setelah kita memiliki arsip kode dari librari program C yang kita buat (kodeC.a), tulis program golang berikut dalam file main.go di folder utama pakaiC.

package main

// #cgo CFLAGS: -I${SRCDIR}/libKodeC
// #cgo LDFLAGS: ${SRCDIR}/kodeC.a
// #include <stdlib.h>
// #include <kodeC.h>
import "C"
import (
	"fmt"
	"unsafe"
)

func main() {
	fmt.Println("Memanggil fungsi di C!")
	C.halo()
	x := C.tambah(3, 8)
	fmt.Println("Hasil tambah 3+8 =", x)
	pesan := C.CString("Halo C!")
	defer C.free(unsafe.Pointer(pesan))
	C.tampilPesan(pesan)
}

Sekarang kita hanya perlu menjalankan program Golang kita dengan perintah go run main.go. Jika berhasil maka akan muncul output seperti berikut:

Memanggil fungsi di C!
Halo dari C !
Hasil tambah 3+8 = 11
Golang mengirimkan pesan : Halo C!