Sorry, I seem to have copy-pasted your Go Playground link instead of
mine, assuming "share" would place it in my clipboard automatically.
https://go.dev/play/p/8XajdwXDdqW
This is what I meant to share.
It outputs the following:
```
before: help = false struct = [{%!t(*bool=0xc00001006d)}]
after: help = true structi = [{%!t(*bool=0xc00001006d)}]
before: fish = init struct = [{%!s(*string=0xc000012090)}]
after: fish = fish struct = [{%!s(*string=0xc000012090)}]
```
fmt.Printf won't dereference the pointers, so you won't get the stored
value. This version, which uses go-spew, will dereference it.
https://go.dev/play/p/p_3QIXd5_at
Output:
```
before: help = false struct = [{<*>false}]
after: help = true structi = [{<*>true}]
before: fish = init struct = [{<*>init}]
after: fish = fish struct = [{<*>fish}]
```
Not 100% it either, but it's closer. And if you want fmt to print with a
specific format, then you could implement a stringer on i_t that does
whatever formatting you want, based on the attributes of i_t.
https://go.dev/play/p/iNv-c6pyMu2
Output:
```
before: help = false struct = [{false}]
after: help = true struct = [{true}]
before: fish = init struct = [{init}]
after: fish = fish struct = [{fish}]
```
On 5/24/25 20:34, 'jlfo...@berkeley.edu' via golang-nuts 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 <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 <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>
> <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/
<https://groups.google.com/d/msgid/>
> golang-nuts/bd06269a-7b6d-442a-
> a3f2-9d4f0020ac90n%40googlegroups.com <http://40googlegroups.com>
<https://
> groups.google.com/d/msgid/golang-nuts/bd06269a-7b6d-442a-
<http://groups.google.com/d/msgid/golang-nuts/bd06269a-7b6d-442a->
> a3f2-9d4f0020ac90n%40googlegroups.com <http://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- <https://groups.google.com/d/msgid/golang->
> nuts/b6f2f0b7-4a8e-4ec4-aa77-10bd07312b39n%40googlegroups.com
<http://40googlegroups.com> <https://
> groups.google.com/d/msgid/golang-nuts/b6f2f0b7-4a8e-4ec4-
<http://groups.google.com/d/msgid/golang-nuts/b6f2f0b7-4a8e-4ec4->
> aa77-10bd07312b39n%40googlegroups.com?
utm_medium=email&utm_source=footer <http://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 <mailto: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>.
--
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/6e2199b9-cf4c-425b-8723-01c7ac2c66a5%40gmail.com.