Btw, please ignore the type logic in my code, I wrote this piece of code
just to illustrate the oddities of generics in struct methods.
Regardless of whether its type is int, string, any, *or the exact uint8,
this error is very strange.*
// it doesn't work
func (c *cachedFn[uint8, V]) Get0() (V, error) {
var s uint8 = 0
s = 0 // error: cannot use 0 (untyped int constant) as uint8 value in
assignment
fmt.Printf("cache key: %#v, %T\n", s, s) // cache key: 0, uint8
return c.Get(s)
}
// it works
func (c *cachedFn[uint8, V]) Get0() (V, error) {
var s uint8 = 0
fmt.Printf("cache key: %#v, %T\n", s, s) // cache key: 0, uint8
return c.Get(s)
}
On Friday, November 10, 2023 at 4:34:46 AM UTC+8 Axel Wagner wrote:
> Yes, this has come up before.
>
> On Fri, Nov 10, 2023 at 7:09 AM ahuigo <[email protected]> wrote:
>
>> There is an example: https://go.dev/play/p/guzOWRKi-yp
>>
>> ```
>> func (c *cachedFn[string, V]) Get0() (V, error) {
>> // var s any
>> var s string
>> s = "abc" // error: cannot use "abc" (untyped string constant) as string
>> value in assignment
>> fmt.Printf("cache key: %#v, %T\n", s, s) // cache key: 0, uint8
>> return c.Get(s)
>> }
>> ```
>> I find the generic type of the struct method a bit confusing.
>> 1. The type `cachedFn[string, V]` does not really constrain the type of
>> `s` to **string**. It's actual type is `uint8`
>>
>
> The type `cachedVn[string, V]` *would* in fact instantiate `cachedVn` with
> `string` and `V`.
> But that's not what you are doing. You are writing the receiver type as
> `fun c(c *cachedFn[string, V])`, which means that "the receiver is the
> generic type `cachedVn` with two type parameters called `string` and `V`".
> Predeclared identifiers in Go are not special in any way, you can re-use
> them for your own variables and types - or type parameters. So what you are
> doing here is fundamentally similar to this problem:
> https://go.dev/play/p/lDE-o7fGHi8
>
> There probably should be a vet check for using a predeclared identifier as
> a type parameter name (or maybe even for any re-use of a predeclared
> identifier).
>
> 2. And this error is a bit strange. (`s = "abc" // error: cannot use
>> "abc" (untyped string constant) as string value in assignment. ` )
>>
>>
>> --
>> 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 [email protected].
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/golang-nuts/58c92577-cb98-401a-978d-c22a1fb493ccn%40googlegroups.com
>>
>> <https://groups.google.com/d/msgid/golang-nuts/58c92577-cb98-401a-978d-c22a1fb493ccn%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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/golang-nuts/e7540f45-1c74-4b51-9ed6-1b60837100bcn%40googlegroups.com.