[go-nuts] Minor Error in Tour of Go?

2024-08-14 Thread 'jlfo...@berkeley.edu' via golang-nuts
In the Interfaces section of "A Tour of Go" it says

"A value of interface type can hold any value that implements those 
methods."

Shouldn't this be

"A variable of interface type can hold any value that implements those 
methods." 

Jon

-- 
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 on the web visit 
https://groups.google.com/d/msgid/golang-nuts/b1d08b0b-273c-4568-88f6-fcd73f48519cn%40googlegroups.com.


Re: [go-nuts] Question About Interface Field in a Structure

2025-05-24 Thread 'jlfo...@berkeley.edu' via golang-nuts
Bingo! This solves the problem. You win the prize!

I hope this discussion helps other people facing similar problems.

Jon


-- 
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/6602d5bc-9d2b-4cab-93d8-0384c7ce5f85n%40googlegroups.com.


Re: [go-nuts] Question About Interface Field in a Structure

2025-05-24 Thread 'jlfo...@berkeley.edu' via golang-nuts

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

[go-nuts] Question About Interface Field in a Structure

2025-05-23 Thread &#x27;jlfo...@berkeley.edu&#x27; via golang-nuts
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)

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





-- 
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/bd06269a-7b6d-442a-a3f2-9d4f0020ac90n%40googlegroups.com.