The problem starts with these two lines:

> var i = []i_t{{help}}
> var t = []i_t{{fish}}

You are initializing the structs with the values stored in `help` and
`fish`, not references to those variables. Thus, when you change the value
stored in the struct it has no effect on the variables from which the
original value in the struct was derived. This has nothing to do with
passing a slice to a function which changes the structs referenced by the
slice. If you replace the function calls with the assignments performed by
the called function you'll see the same behavior.

If you want assignments to the struct member to affect `help` and `fish`
you have to store a pointer to those variables in the struct.

On Sat, May 24, 2025 at 10:34 AM 'jlfo...@berkeley.edu' via golang-nuts <
golang-nuts@googlegroups.com> wrote:

>
> 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
>> > <golan...@googlegroups.com> 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 = false    struct = [{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
>> >
>> >
>> >
>> >
>> >
>> > --
>> > 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...@googlegroups.com.
>> > To view this discussion visit https://groups.google.com/d/msgid/
>> > golang-nuts/bd06269a-7b6d-442a-
>> > a3f2-9d4f0020ac90n%40googlegroups.com <https://
>> > groups.google.com/d/msgid/golang-nuts/bd06269a-7b6d-442a-
>> > a3f2-9d4f0020ac90n%40googlegroups.com?
>> > utm_medium=email&utm_source=footer>.
>> >
>> > --
>> > 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...@googlegroups.com <mailto:golang-
>> > nuts+uns...@googlegroups.com>.
>> > To view this discussion visit https://groups.google.com/d/msgid/golang-
>> > nuts/b6f2f0b7-4a8e-4ec4-aa77-10bd07312b39n%40googlegroups.com <https://
>> > groups.google.com/d/msgid/golang-nuts/b6f2f0b7-4a8e-4ec4-
>> > aa77-10bd07312b39n%
>> 40googlegroups.com?utm_medium=email&utm_source=footer>.
>>
>> --
> 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 visit
> https://groups.google.com/d/msgid/golang-nuts/325d131b-6e83-4f66-ad04-a88f5f853e5bn%40googlegroups.com
> <https://groups.google.com/d/msgid/golang-nuts/325d131b-6e83-4f66-ad04-a88f5f853e5bn%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>


-- 
Kurtis Rader
Caretaker of the exceptional canines Junior and Hank

-- 
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 visit 
https://groups.google.com/d/msgid/golang-nuts/CABx2%3DD_s3YkFae3BWXNjvSZ8YVLbRTtzYeequoWvzHuH0KC_3g%40mail.gmail.com.

Reply via email to