Thank you Ian!! That does make sense.

Can you please elaborate why hardcoding device = "eth1" works? What is the
difference here?

Sincerely,
Chun

On Mon, Nov 6, 2017 at 1:19 PM, Ian Lance Taylor <i...@golang.org> wrote:

> On Mon, Nov 6, 2017 at 4:25 AM, Chun Zhang <chunzh...@gmail.com> wrote:
> >
> > 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.
>
> A Go string contains an internal pointer.  Passing a *string to cgo
> means that you are passing a pointer to a string that contains a
> pointer, so you are passing a pointer to a pointer.  That is invalid
> according to the cgo pointer passing rules.
>
> A Go string is definitely not a C or C++ string.  You can not pass a
> pointer to a Go string to C code that expects a char**.  Even if cgo
> permitted it, it would not work.  If SWIG is converting a C char** (or
> char*[]) to Go *string, then SWIG is getting it wrong.
>
> Ian
>
>
> > 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.
>

-- 
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