Thanks for your and Brian's replies.
But, unless I'm missing something, neither solve the problem. I ran both of
them in the Go Playground and they both produced the same incorrect result.
The result I'm looking for would be:
before: help = false struct = [{false}]
after: help = true struct = [{true}]
before: fish = init struct = [{init}]
after: fish = fish struct = [{fish}]
In other words, the simple variable would have the same value as the
structure field.
I'm aware that Go passes slices to functions by value, which means that a
copy of the
slice header is passed. But, since I'm not changing the length of the slice
this shouldn't matter.
Rather, I'm trying to change a variable that's in a structure field. I was
hoping that this was
the critical difference, but apparently I'm wrong.
I've tried putting the address of help and fish into the structure but that
didn't change anything.
I couldn't figure out how to change the struct definition to make it clear
I'm passing a pointer.
I've spent an embarrassing amount of time on this without getting anywhere
so I appreciate any suggestions.
Jon
On Saturday, May 24, 2025 at 8:39:11 AM UTC-7 Mikk Margus wrote:
> As far as I can tell, they're asking for a way for `var help`/`var fish`
> etc. to get updated alongside the attribute `i_t.arg` in the update
> methods.
> This example accomplishes this.
> https://go.dev/play/p/7y5COCLU5EP
>
> Do note that it crashes and burns if the pointer is not of the expected
> type, and type checks/type switches could be used to check the
> underlying type before use. Or store it separately. Or just avoid weak
> typing altogether, if possible.
>
> On 5/24/25 10:48, 'Brian Candler' via golang-nuts wrote:
> > Or you can use a setter method:
> > https://go.dev/play/p/W9Cz2PO8NeK
> >
> > On Saturday, 24 May 2025 at 03:39:34 UTC+1 Def Ceb wrote:
> >
> > You're creating new copies of the values and modifying the copies,
> > rather than storing a reference and then modifying the original data
> > through it.
> > You'd use *string and *bool there to have both change.
> > This would be somewhat tedious and involve a good amount of type
> > casting though, if you were to keep doing it with interfaces like
> > this. It could well be that you'd be better served by avoiding them
> > in this instance. But if you must, then learn to enjoy type switches.
> >
> > On Sat, May 24, 2025, 05:17 'jlfo...@berkeley.edu' via golang-nuts
> > wrote:
> >
> > I'm trying to write a program (see below) that passes a slice of
> > structs to a function. One of the struct fields is an
> > interface{} that sometimes will hold a boolean value and other
> > times will hold a string value. To do this, I put either a bool
> > or a string variable in the field.
> >
> > What I want to happen is for the local variable to be assigned a
> > value. But, what's happening instead is only the struct field is
> > assigned the value.
> >
> > Here's the program: (also at https://go.dev/play/p/7y5COCLU5EP
> > <https://go.dev/play/p/7y5COCLU5EP>)
> >
> > package main
> >
> > import (
> > "fmt"
> > )
> >
> > type i_t struct {
> > arg interface{}
> > }
> >
> > func main() {
> >
> > var help bool = false
> > var fish string = "init"
> >
> > var i = []i_t{{help}}
> > var t = []i_t{{fish}}
> >
> > fmt.Printf("before: help = %t\tstruct = %t\n", help, i)
> > change_bool1(i)
> > fmt.Printf("after: help = %t\tstruct = %t\n", help, i)
> >
> > fmt.Println()
> >
> > fmt.Printf("before: fish = %s\tstruct = %s\n", fish, t)
> > change_string1(t)
> > fmt.Printf("after: fish = %s\tstruct = %s\n", fish, t)
> >
> > }
> >
> > func change_bool1(a []i_t) {
> >
> > a[0].arg = true
> > }
> >
> > func change_string1(a []i_t) {
> >
> > a[0].arg = "fish"
> > }
> >
> > It generates the following output:
> >
> > before: help = falsestruct = [{false}]
> > after: help = false struct = [{true}]
> >
> > before: fish = init struct = [{init}]
> > after: fish = init struct = [{fish}]
> >
> > You can see that the values of the variables aren't changing but
> > the values of the
> > struct fields are. Is there some way for both to change?
> >
> > Cordially,
> > Jon Forrest
> >
> >
> >
> >
&g