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 <a13...@gmail.com> 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 golang-nuts...@googlegroups.com.
>> 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 golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/e7540f45-1c74-4b51-9ed6-1b60837100bcn%40googlegroups.com.

Reply via email to