Go est arrivé en force dans nos usages, directement ou indirectement (Docker, Caddy, etc.). Mais malgré une adoption de plus en plus grande, il peut arriver qu’une brique indispensable à notre projet ne soit pas disponible en Go et que réaliser un portage s’avère trop coûteux. Heureusement pour nous, les concepteurs du langage ont fait en sorte que Go puisse communiquer avec des librairies dont l’ABI (Application Binary Interface) est compatible avec l’ABI C.
L’apparition de nouveaux langages de programmation est une opportunité pour remettre en question nos connaissances et les différentes technologies que nous utilisons quotidiennement. Ces nouveaux savoir-faire arrivent souvent à se faire une place de premier plan dans notre processus de développement. Mais pouvons-nous pour autant oublier nos anciens outils et opérer une migration sans perte ? Dans le cadre de cet article, nous explorerons la capacité du runtime Go à appeler du code C. L’exemple choisi dans cet article se veut plus pédagogique que pertinent. La méthode présentée est généralisable à tout projet mêlant Go et C.
L’auteur part du principe que le lecteur possède les notions élémentaires concernant le langage C ainsi que le processus de compilation. L’ensemble du code Go utilisé dans cet article est disponible sur le dépôt GitHub correspondant [1].
1. Une histoire de GPS
L’auteur de cet article a acquis un « logger » GPS Navilink...
- Accédez à tous les contenus de Connect en illimité
- Découvrez des listes de lecture et des contenus Premium
- Consultez les nouveaux articles en avant-première
[1] Code source des exemples : https://github.com/yageek/go-navilink
[2] OpenStreetMap : https://openstreetmap.org
[3] NAVILINK Protocol : https://splitbrain.haz.wiki/navilink
[4] Protocole RS232 : https://fr.wikipedia.org/wiki/RS-232
[5] Pilotes pour puces Prolific : http://www.prolific.com.tw/US/ShowProduct.aspx?pcid=41&showlevel=0041
[6] Python C API : https://docs.python.org/2/c-api/index.html
[7] Ruby C API : https://docs.ruby-lang.org/en/2.6.0/extension_rdoc.html
[8] Rust Nomicon FFI : https://docs.ruby-lang.org/en/2.6.0/extension_rdoc.html
[9] Manuel d’utilisation de la commande cgo - section « Using cgo with the go command » : https://golang.org/cmd/cgo/#hdr-Using_cgo_with_the_go_command
[10] Manuel d’utilisation de la commande cgo – section « Go references to C » : https://golang.org/cmd/cgo/#hdr-Go_references_to_C
[11] Librairie C implémentant le protocole Locosys : https://github.com/yageek/navilink
[12] Librairie C gérant l’accès au port série : https://sigrok.org/wiki/Libserialport
[13] Format GeoJSON : https://fr.wikipedia.org/wiki/GeoJSON
[14] Format GPX : https://fr.wikipedia.org/wiki/GPX_(format_de_fichier)
[15] Paquet Go gérant le format GeoJSON : http://github.com/kpawlik/geojson