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.