Thank you for the info.  The purpose of using generics is to avoid reflect 
or interface{}, at least for me :-)

在2024年4月8日星期一 UTC+8 18:35:18<Axel Wagner> 写道:

> Yes, the *underlying type* of Class is `byte`, but the type-switch checks 
> if the dynamic type is *exactly* `byte`.
> The only way, currently, to implement the kind of check you want is to use 
> reflect:
>
> switch rv := reflect.ValueOf(v); rv.Kind() {
> case reflect.Uint8: // byte
>     v := uint8(rv.Uint())
> // ...
> }
>
> Though you might be interested in #45380 
> <https://github.com/golang/go/issues/45380>, which would be able to solve 
> this without reflect.
>
> On Mon, Apr 8, 2024 at 11:04 AM Xiangrong Fang <xrf...@gmail.com> wrote:
>
>> I wrote a TLV handling package: go.xrfang.cn/tlv 
>> <https://pkg.go.dev/go.xrfang.cn/tlv>, and encountered problem with type 
>> checking.  Problematic code below:
>>
>> 1.  The "Set" function in side tlv package:
>>
>> package tlv
>>
>> type (
>>     ValueType interface {
>>         string | []byte | ~float32 | ~float64 |
>>         ~int8 | ~int16 | ~int32 | ~int64 |
>>         ~uint8 | ~uint16 | ~uint32 | ~uint64
>>     }
>>     Prop map[byte][]byte
>> )
>>
>> func Set[T ValueType](p Prop, tag byte, val T) Prop {
>>     ... ...
>>     switch v := any(val).(type) {
>>     case string:
>>     ... ...
>>     default:
>>         fmt.Printf("tlv.Set: '%T' not supported!\n", val) 
>>     }
>>     ...
>> }
>>
>> 2. event.go, which uses tlv:
>>
>> package event
>>
>> import (
>> "go.xrfang.cn/tlv"
>> )
>>
>> type (
>> Class byte
>> Event struct {
>> tlv.Prop
>> }
>> )
>>
>> const (
>> TagClass  = 3
>> )
>>
>> func (e *Event) WithClass(cls Class) *Event {
>> (*e).Prop = tlv.Set((*e).Prop, TagClass, cls)
>> return e
>> }
>>
>> The problem is, while the Class type is based on "byte", it should be 
>> accepted by tlv.Set(), which is the case (there is no compiler error).  But 
>> when the code is running, it printed error message: tlv.Set: 'event.Class' 
>> not supported!
>>
>> -- 
>> 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/b4786988-b9da-44c3-9070-ba718f3be5ban%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/golang-nuts/b4786988-b9da-44c3-9070-ba718f3be5ban%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/e62f3c2c-039e-4dec-9b9d-27da3ea20adan%40googlegroups.com.

Reply via email to