You can create Go plugins too. 

> On Oct 8, 2019, at 7:57 AM, Vitaly Isaev <vitalyisa...@gmail.com> wrote:
> 
> 
> Suggest we're implementing a very specific Go application like data migrator 
> (for example, the one that transfers data from old database to new database 
> with different data types). Therefore, this application must be compiled with 
> two different versions of one library (e.g. v1 and v2). It seems to be 
> impossible in terms of Go modules (see this ticket), but can we do this trick 
> with C shared libraries?
> 
> Minimal example:
> 
> v1/lib.h
> #ifndef LIBCGO_MULTIVERSION_V1
> #define LIBCGO_MULTIVERSION_V1
> 
> int add(int a, int b);
> 
> #endif
> 
> v1/lib.c
> #include "lib.h"
> 
> int add(int a, int b) {
>     return a + b;
> }
> 
> v1/lib.go
> package cgomultiversion
> 
> // #cgo LDFLAGS: -l:libcgomultiversion.so.1
> // #include <cgomultiversion_v1/lib.h>
> import "C"
> 
> func Add(a, b int) int {
>       return int(C.add(C.int(a), C.int(b)))
> }
> 
> v2/lib.h
> #ifndef LIBCGO_MULTIVERSION_V2
> #define LIBCGO_MULTIVERSION_V2
> 
> int add(int a, int b);
> 
> #endif
> 
> v2/lib.c
> #include "lib.h"
> 
> int add(int a, int b) {
>     // for tests purposes addition is replaced with multiplication in v2
>     return a * b;
> }
> 
> v2/lib.go
> package cgomultiversion
> 
> // #cgo LDFLAGS: -l:libcgomultiversion.so.2
> // #include <cgomultiversion_v2/lib.h>
> import "C"
> 
> func Add(a, b int) int {
>       return int(C.add(C.int(a), C.int(b)))
> }
> 
> Finally we have a test that tries to utilize both versions of C library:
> package cgomultiversion
> 
> import (
>       "testing"
>       "github.com/stretchr/testify/assert"
>       cgomultiversion1 "github.com/vitalyisaev2/cgo_multiversion_go_lib/v1"
>       cgomultiversion2 "github.com/vitalyisaev2/cgo_multiversion_go_lib/v2"
> )
> 
> func TestAdd(t *testing.T) {
>       assert.Equal(t, 10, cgomultiversion1.Add(5, 5))
>       assert.Equal(t, 25, cgomultiversion2.Add(5, 5))
> }
> 
> This won't compile because of naming conflict on the C side:
> go test -count=1 -v        
> # github.com/vitalyisaev2/cgo_multiversion_go_lib.test
> /usr/local/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
> /usr/bin/ld: /tmp/go-link-218143790/000005.o: in function `add':
> /home/isaev/go/src/github.com/vitalyisaev2/cgo_multiversion_go_lib/v2/lib.c:6:
>  multiple definition of `add'; 
> /tmp/go-link-218143790/000002.o:/home/isaev/go/src/github.com/vitalyisaev2/cgo_multiversion_go_lib/v1/lib.c:5:
>  first defined here
> collect2: error: ld returned 1 exit status
> 
> 
> Full example is available at: 
> https://github.com/vitalyisaev2/cgo_multiversion_go_lib
> 
> Is it possible to achieve this with some other methods? Thanks a lot.
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "golang-nuts" group.
> To unsubscribe from this group and stop receiving emails from it, send an 
> email to golang-nuts+unsubscr...@googlegroups.com.
> To view this discussion on the web visit 
> https://groups.google.com/d/msgid/golang-nuts/1778392c-d0d6-4ff9-9385-380483078626%40googlegroups.com.

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/F4EC49F0-CF21-42D3-8589-7BF663300D50%40ix.netcom.com.

Reply via email to