Hi, 

Thank you for the reply! 

The C libi.PI_init_global_config has the interface of 
PI_init_global_config(int argc, char *argv[]);
so Swig converts it to PI_init_global_config(arg1 int, arg2 *string)

The code was expecting to a *string. Viper.GetString returns a string as 
far as I can see, is that right? So device is a string, not a *string. 
(verified with reflect.TypeOf). Everything matches except for the crash :(

What really puzzles me is that why when passing the parameter using flag is 
fine, as well as when hard-coding the value. In both cases, device is still 
a string, nothing changed. But whenever trying to read the value from a 
config file using viper or just simple json.decoder, the code complains it 
is a pointer to a pointer. I mean, I literally did a comparison between the 
read-in value and a variable hard-coded as "eth1", it says they are equal. 

Best,
Chun





On Monday, November 6, 2017 at 1:07:46 AM UTC-5, Tamás Gulácsi wrote:
>
>
> 2017. november 6., hétfő 2:11:48 UTC+1 időpontban Chun Zhang a következőt 
> írta:
>>
>> Hi, All, 
>>
>> I am trying to read a configuration file using Viper, the config file is 
>> a very simple json file with one line
>> {
>> "device" : "eth1"
>> }
>>
>> I use the following line to read it 
>>
>> device := viper.GetString("device")
>>
>>
>> then passing this var further into a C library with swig generated api as 
>> arg2
>>
>> itc := device //Need to update if there is more devices
>> libpi.PI_init_global_config(1, &itc)
>>
>> func PI_init_global_config(arg1 int, arg2 *string) {
>>
>>
>>
>> I can retrieve the correct value,  and can verify that var device does 
>> have eth1 as the value when printf it.  I even did the compare of device == 
>> "eth1", and the result is true. 
>>
>> However, when passing this device var to the PI_init_gloable_config API, 
>> I got code crashed with the following error
>>
>> *panic: runtime error: cgo argument has Go pointer to Go pointer*
>>
>>
>
> The value you pass to C must not have a pointer which points to a Go 
> pointer. 
> What are you passing to  libpi.PI_init_global_config ?
> I think "device" is already a *string, so &itc is a **string - try 
> libpi.PI_init_global_config(device).
>
> (I assume libpi does some conversion, as the proper way to pass a string 
> ot C (*char) is to convert the string to *char with cs:=C.CString(*device) 
> and later C.free(unsafe.Pointer(cs)) it).
>
>>
>> If instead of reading this file from configuration json, I hardcode it in 
>> the code as 
>>
>> device := "eth1"
>>
>> then there is no issue at all. If I read this variable using Flag from 
>> command line, like
>>
>> flag.StringVar(&device, "Device", "eth1", "NIC to Listen")
>>
>>
>> there was no problem either. 
>>
>>
>>
>> Can anybody please enlighten me what's the difference? Why this error is 
>> triggered? I googled quite a bit, but it does not seem to help. I have go 
>> 1.8.3 installed.
>>
>> Thanks,
>> Chun
>>
>

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to