PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i WWWWWW
Current Directory: /opt/golang/1.22.0/src/internal/reflectlite
Viewing File: /opt/golang/1.22.0/src/internal/reflectlite/all_test.go
// Copyright 2009 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package reflectlite_test import ( "encoding/base64" "fmt" "internal/abi" . "internal/reflectlite" "math" "reflect" "runtime" "testing" "unsafe" ) func ToValue(v Value) reflect.Value { return reflect.ValueOf(ToInterface(v)) } func TypeString(t Type) string { return fmt.Sprintf("%T", ToInterface(Zero(t))) } type integer int type T struct { a int b float64 c string d *int } type pair struct { i any s string } func assert(t *testing.T, s, want string) { t.Helper() if s != want { t.Errorf("have %#q want %#q", s, want) } } var typeTests = []pair{ {struct{ x int }{}, "int"}, {struct{ x int8 }{}, "int8"}, {struct{ x int16 }{}, "int16"}, {struct{ x int32 }{}, "int32"}, {struct{ x int64 }{}, "int64"}, {struct{ x uint }{}, "uint"}, {struct{ x uint8 }{}, "uint8"}, {struct{ x uint16 }{}, "uint16"}, {struct{ x uint32 }{}, "uint32"}, {struct{ x uint64 }{}, "uint64"}, {struct{ x float32 }{}, "float32"}, {struct{ x float64 }{}, "float64"}, {struct{ x int8 }{}, "int8"}, {struct{ x (**int8) }{}, "**int8"}, {struct{ x (**integer) }{}, "**reflectlite_test.integer"}, {struct{ x ([32]int32) }{}, "[32]int32"}, {struct{ x ([]int8) }{}, "[]int8"}, {struct{ x (map[string]int32) }{}, "map[string]int32"}, {struct{ x (chan<- string) }{}, "chan<- string"}, {struct { x struct { c chan *int32 d float32 } }{}, "struct { c chan *int32; d float32 }", }, {struct{ x (func(a int8, b int32)) }{}, "func(int8, int32)"}, {struct { x struct { c func(chan *integer, *int8) } }{}, "struct { c func(chan *reflectlite_test.integer, *int8) }", }, {struct { x struct { a int8 b int32 } }{}, "struct { a int8; b int32 }", }, {struct { x struct { a int8 b int8 c int32 } }{}, "struct { a int8; b int8; c int32 }", }, {struct { x struct { a int8 b int8 c int8 d int32 } }{}, "struct { a int8; b int8; c int8; d int32 }", }, {struct { x struct { a int8 b int8 c int8 d int8 e int32 } }{}, "struct { a int8; b int8; c int8; d int8; e int32 }", }, {struct { x struct { a int8 b int8 c int8 d int8 e int8 f int32 } }{}, "struct { a int8; b int8; c int8; d int8; e int8; f int32 }", }, {struct { x struct { a int8 `reflect:"hi there"` } }{}, `struct { a int8 "reflect:\"hi there\"" }`, }, {struct { x struct { a int8 `reflect:"hi \x00there\t\n\"\\"` } }{}, `struct { a int8 "reflect:\"hi \\x00there\\t\\n\\\"\\\\\"" }`, }, {struct { x struct { f func(args ...int) } }{}, "struct { f func(...int) }", }, // {struct { // x (interface { // a(func(func(int) int) func(func(int)) int) // b() // }) // }{}, // "interface { reflectlite_test.a(func(func(int) int) func(func(int)) int); reflectlite_test.b() }", // }, {struct { x struct { int32 int64 } }{}, "struct { int32; int64 }", }, } var valueTests = []pair{ {new(int), "132"}, {new(int8), "8"}, {new(int16), "16"}, {new(int32), "32"}, {new(int64), "64"}, {new(uint), "132"}, {new(uint8), "8"}, {new(uint16), "16"}, {new(uint32), "32"}, {new(uint64), "64"}, {new(float32), "256.25"}, {new(float64), "512.125"}, {new(complex64), "532.125+10i"}, {new(complex128), "564.25+1i"}, {new(string), "stringy cheese"}, {new(bool), "true"}, {new(*int8), "*int8(0)"}, {new(**int8), "**int8(0)"}, {new([5]int32), "[5]int32{0, 0, 0, 0, 0}"}, {new(**integer), "**reflectlite_test.integer(0)"}, {new(map[string]int32), "map[string]int32{<can't iterate on maps>}"}, {new(chan<- string), "chan<- string"}, {new(func(a int8, b int32)), "func(int8, int32)(arg)"}, {new(struct { c chan *int32 d float32 }), "struct { c chan *int32; d float32 }{chan *int32, 0}", }, {new(struct{ c func(chan *integer, *int8) }), "struct { c func(chan *reflectlite_test.integer, *int8) }{func(chan *reflectlite_test.integer, *int8)(arg)}", }, {new(struct { a int8 b int32 }), "struct { a int8; b int32 }{0, 0}", }, {new(struct { a int8 b int8 c int32 }), "struct { a int8; b int8; c int32 }{0, 0, 0}", }, } func testType(t *testing.T, i int, typ Type, want string) { s := TypeString(typ) if s != want { t.Errorf("#%d: have %#q, want %#q", i, s, want) } } func testReflectType(t *testing.T, i int, typ Type, want string) { s := TypeString(typ) if s != want { t.Errorf("#%d: have %#q, want %#q", i, s, want) } } func TestTypes(t *testing.T) { for i, tt := range typeTests { testReflectType(t, i, Field(ValueOf(tt.i), 0).Type(), tt.s) } } func TestSetValue(t *testing.T) { for i, tt := range valueTests { v := ValueOf(tt.i).Elem() switch v.Kind() { case abi.Int: v.Set(ValueOf(int(132))) case abi.Int8: v.Set(ValueOf(int8(8))) case abi.Int16: v.Set(ValueOf(int16(16))) case abi.Int32: v.Set(ValueOf(int32(32))) case abi.Int64: v.Set(ValueOf(int64(64))) case abi.Uint: v.Set(ValueOf(uint(132))) case abi.Uint8: v.Set(ValueOf(uint8(8))) case abi.Uint16: v.Set(ValueOf(uint16(16))) case abi.Uint32: v.Set(ValueOf(uint32(32))) case abi.Uint64: v.Set(ValueOf(uint64(64))) case abi.Float32: v.Set(ValueOf(float32(256.25))) case abi.Float64: v.Set(ValueOf(512.125)) case abi.Complex64: v.Set(ValueOf(complex64(532.125 + 10i))) case abi.Complex128: v.Set(ValueOf(complex128(564.25 + 1i))) case abi.String: v.Set(ValueOf("stringy cheese")) case abi.Bool: v.Set(ValueOf(true)) } s := valueToString(v) if s != tt.s { t.Errorf("#%d: have %#q, want %#q", i, s, tt.s) } } } func TestCanSetField(t *testing.T) { type embed struct{ x, X int } type Embed struct{ x, X int } type S1 struct { embed x, X int } type S2 struct { *embed x, X int } type S3 struct { Embed x, X int } type S4 struct { *Embed x, X int } type testCase struct { index []int canSet bool } tests := []struct { val Value cases []testCase }{{ val: ValueOf(&S1{}), cases: []testCase{ {[]int{0}, false}, {[]int{0, 0}, false}, {[]int{0, 1}, true}, {[]int{1}, false}, {[]int{2}, true}, }, }, { val: ValueOf(&S2{embed: &embed{}}), cases: []testCase{ {[]int{0}, false}, {[]int{0, 0}, false}, {[]int{0, 1}, true}, {[]int{1}, false}, {[]int{2}, true}, }, }, { val: ValueOf(&S3{}), cases: []testCase{ {[]int{0}, true}, {[]int{0, 0}, false}, {[]int{0, 1}, true}, {[]int{1}, false}, {[]int{2}, true}, }, }, { val: ValueOf(&S4{Embed: &Embed{}}), cases: []testCase{ {[]int{0}, true}, {[]int{0, 0}, false}, {[]int{0, 1}, true}, {[]int{1}, false}, {[]int{2}, true}, }, }} for _, tt := range tests { t.Run(tt.val.Type().Name(), func(t *testing.T) { for _, tc := range tt.cases { f := tt.val for _, i := range tc.index { if f.Kind() == Ptr { f = f.Elem() } f = Field(f, i) } if got := f.CanSet(); got != tc.canSet { t.Errorf("CanSet() = %v, want %v", got, tc.canSet) } } }) } } var _i = 7 var valueToStringTests = []pair{ {123, "123"}, {123.5, "123.5"}, {byte(123), "123"}, {"abc", "abc"}, {T{123, 456.75, "hello", &_i}, "reflectlite_test.T{123, 456.75, hello, *int(&7)}"}, {new(chan *T), "*chan *reflectlite_test.T(&chan *reflectlite_test.T)"}, {[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}"}, {&[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "*[10]int(&[10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})"}, {[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}"}, {&[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}, "*[]int(&[]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10})"}, } func TestValueToString(t *testing.T) { for i, test := range valueToStringTests { s := valueToString(ValueOf(test.i)) if s != test.s { t.Errorf("#%d: have %#q, want %#q", i, s, test.s) } } } func TestPtrSetNil(t *testing.T) { var i int32 = 1234 ip := &i vip := ValueOf(&ip) vip.Elem().Set(Zero(vip.Elem().Type())) if ip != nil { t.Errorf("got non-nil (%d), want nil", *ip) } } func TestMapSetNil(t *testing.T) { m := make(map[string]int) vm := ValueOf(&m) vm.Elem().Set(Zero(vm.Elem().Type())) if m != nil { t.Errorf("got non-nil (%p), want nil", m) } } func TestAll(t *testing.T) { testType(t, 1, TypeOf((int8)(0)), "int8") testType(t, 2, TypeOf((*int8)(nil)).Elem(), "int8") typ := TypeOf((*struct { c chan *int32 d float32 })(nil)) testType(t, 3, typ, "*struct { c chan *int32; d float32 }") etyp := typ.Elem() testType(t, 4, etyp, "struct { c chan *int32; d float32 }") } func TestInterfaceValue(t *testing.T) { var inter struct { E any } inter.E = 123.456 v1 := ValueOf(&inter) v2 := Field(v1.Elem(), 0) // assert(t, TypeString(v2.Type()), "interface {}") v3 := v2.Elem() assert(t, TypeString(v3.Type()), "float64") i3 := ToInterface(v2) if _, ok := i3.(float64); !ok { t.Error("v2.Interface() did not return float64, got ", TypeOf(i3)) } } func TestFunctionValue(t *testing.T) { var x any = func() {} v := ValueOf(x) if fmt.Sprint(ToInterface(v)) != fmt.Sprint(x) { t.Fatalf("TestFunction returned wrong pointer") } assert(t, TypeString(v.Type()), "func()") } var appendTests = []struct { orig, extra []int }{ {make([]int, 2, 4), []int{22}}, {make([]int, 2, 4), []int{22, 33, 44}}, } func sameInts(x, y []int) bool { if len(x) != len(y) { return false } for i, xx := range x { if xx != y[i] { return false } } return true } func TestBigUnnamedStruct(t *testing.T) { b := struct{ a, b, c, d int64 }{1, 2, 3, 4} v := ValueOf(b) b1 := ToInterface(v).(struct { a, b, c, d int64 }) if b1.a != b.a || b1.b != b.b || b1.c != b.c || b1.d != b.d { t.Errorf("ValueOf(%v).Interface().(*Big) = %v", b, b1) } } type big struct { a, b, c, d, e int64 } func TestBigStruct(t *testing.T) { b := big{1, 2, 3, 4, 5} v := ValueOf(b) b1 := ToInterface(v).(big) if b1.a != b.a || b1.b != b.b || b1.c != b.c || b1.d != b.d || b1.e != b.e { t.Errorf("ValueOf(%v).Interface().(big) = %v", b, b1) } } type Basic struct { x int y float32 } type NotBasic Basic type DeepEqualTest struct { a, b any eq bool } // Simple functions for DeepEqual tests. var ( fn1 func() // nil. fn2 func() // nil. fn3 = func() { fn1() } // Not nil. ) type self struct{} type Loop *Loop type Loopy any var loop1, loop2 Loop var loopy1, loopy2 Loopy func init() { loop1 = &loop2 loop2 = &loop1 loopy1 = &loopy2 loopy2 = &loopy1 } var typeOfTests = []DeepEqualTest{ // Equalities {nil, nil, true}, {1, 1, true}, {int32(1), int32(1), true}, {0.5, 0.5, true}, {float32(0.5), float32(0.5), true}, {"hello", "hello", true}, {make([]int, 10), make([]int, 10), true}, {&[3]int{1, 2, 3}, &[3]int{1, 2, 3}, true}, {Basic{1, 0.5}, Basic{1, 0.5}, true}, {error(nil), error(nil), true}, {map[int]string{1: "one", 2: "two"}, map[int]string{2: "two", 1: "one"}, true}, {fn1, fn2, true}, // Inequalities {1, 2, false}, {int32(1), int32(2), false}, {0.5, 0.6, false}, {float32(0.5), float32(0.6), false}, {"hello", "hey", false}, {make([]int, 10), make([]int, 11), false}, {&[3]int{1, 2, 3}, &[3]int{1, 2, 4}, false}, {Basic{1, 0.5}, Basic{1, 0.6}, false}, {Basic{1, 0}, Basic{2, 0}, false}, {map[int]string{1: "one", 3: "two"}, map[int]string{2: "two", 1: "one"}, false}, {map[int]string{1: "one", 2: "txo"}, map[int]string{2: "two", 1: "one"}, false}, {map[int]string{1: "one"}, map[int]string{2: "two", 1: "one"}, false}, {map[int]string{2: "two", 1: "one"}, map[int]string{1: "one"}, false}, {nil, 1, false}, {1, nil, false}, {fn1, fn3, false}, {fn3, fn3, false}, {[][]int{{1}}, [][]int{{2}}, false}, {math.NaN(), math.NaN(), false}, {&[1]float64{math.NaN()}, &[1]float64{math.NaN()}, false}, {&[1]float64{math.NaN()}, self{}, true}, {[]float64{math.NaN()}, []float64{math.NaN()}, false}, {[]float64{math.NaN()}, self{}, true}, {map[float64]float64{math.NaN(): 1}, map[float64]float64{1: 2}, false}, {map[float64]float64{math.NaN(): 1}, self{}, true}, // Nil vs empty: not the same. {[]int{}, []int(nil), false}, {[]int{}, []int{}, true}, {[]int(nil), []int(nil), true}, {map[int]int{}, map[int]int(nil), false}, {map[int]int{}, map[int]int{}, true}, {map[int]int(nil), map[int]int(nil), true}, // Mismatched types {1, 1.0, false}, {int32(1), int64(1), false}, {0.5, "hello", false}, {[]int{1, 2, 3}, [3]int{1, 2, 3}, false}, {&[3]any{1, 2, 4}, &[3]any{1, 2, "s"}, false}, {Basic{1, 0.5}, NotBasic{1, 0.5}, false}, {map[uint]string{1: "one", 2: "two"}, map[int]string{2: "two", 1: "one"}, false}, // Possible loops. {&loop1, &loop1, true}, {&loop1, &loop2, true}, {&loopy1, &loopy1, true}, {&loopy1, &loopy2, true}, } func TestTypeOf(t *testing.T) { // Special case for nil if typ := TypeOf(nil); typ != nil { t.Errorf("expected nil type for nil value; got %v", typ) } for _, test := range typeOfTests { v := ValueOf(test.a) if !v.IsValid() { continue } typ := TypeOf(test.a) if typ != v.Type() { t.Errorf("TypeOf(%v) = %v, but ValueOf(%v).Type() = %v", test.a, typ, test.a, v.Type()) } } } func Nil(a any, t *testing.T) { n := Field(ValueOf(a), 0) if !n.IsNil() { t.Errorf("%v should be nil", a) } } func NotNil(a any, t *testing.T) { n := Field(ValueOf(a), 0) if n.IsNil() { t.Errorf("value of type %v should not be nil", TypeString(ValueOf(a).Type())) } } func TestIsNil(t *testing.T) { // These implement IsNil. // Wrap in extra struct to hide interface type. doNil := []any{ struct{ x *int }{}, struct{ x any }{}, struct{ x map[string]int }{}, struct{ x func() bool }{}, struct{ x chan int }{}, struct{ x []string }{}, struct{ x unsafe.Pointer }{}, } for _, ts := range doNil { ty := TField(TypeOf(ts), 0) v := Zero(ty) v.IsNil() // panics if not okay to call } // Check the implementations var pi struct { x *int } Nil(pi, t) pi.x = new(int) NotNil(pi, t) var si struct { x []int } Nil(si, t) si.x = make([]int, 10) NotNil(si, t) var ci struct { x chan int } Nil(ci, t) ci.x = make(chan int) NotNil(ci, t) var mi struct { x map[int]int } Nil(mi, t) mi.x = make(map[int]int) NotNil(mi, t) var ii struct { x any } Nil(ii, t) ii.x = 2 NotNil(ii, t) var fi struct { x func(t *testing.T) } Nil(fi, t) fi.x = TestIsNil NotNil(fi, t) } // Indirect returns the value that v points to. // If v is a nil pointer, Indirect returns a zero Value. // If v is not a pointer, Indirect returns v. func Indirect(v Value) Value { if v.Kind() != Ptr { return v } return v.Elem() } func TestNilPtrValueSub(t *testing.T) { var pi *int if pv := ValueOf(pi); pv.Elem().IsValid() { t.Error("ValueOf((*int)(nil)).Elem().IsValid()") } } type Point struct { x, y int } // This will be index 0. func (p Point) AnotherMethod(scale int) int { return -1 } // This will be index 1. func (p Point) Dist(scale int) int { //println("Point.Dist", p.x, p.y, scale) return p.x*p.x*scale + p.y*p.y*scale } // This will be index 2. func (p Point) GCMethod(k int) int { runtime.GC() return k + p.x } // This will be index 3. func (p Point) NoArgs() { // Exercise no-argument/no-result paths. } // This will be index 4. func (p Point) TotalDist(points ...Point) int { tot := 0 for _, q := range points { dx := q.x - p.x dy := q.y - p.y tot += dx*dx + dy*dy // Should call Sqrt, but it's just a test. } return tot } type D1 struct { d int } type D2 struct { d int } func TestImportPath(t *testing.T) { tests := []struct { t Type path string }{ {TypeOf(&base64.Encoding{}).Elem(), "encoding/base64"}, {TypeOf(int(0)), ""}, {TypeOf(int8(0)), ""}, {TypeOf(int16(0)), ""}, {TypeOf(int32(0)), ""}, {TypeOf(int64(0)), ""}, {TypeOf(uint(0)), ""}, {TypeOf(uint8(0)), ""}, {TypeOf(uint16(0)), ""}, {TypeOf(uint32(0)), ""}, {TypeOf(uint64(0)), ""}, {TypeOf(uintptr(0)), ""}, {TypeOf(float32(0)), ""}, {TypeOf(float64(0)), ""}, {TypeOf(complex64(0)), ""}, {TypeOf(complex128(0)), ""}, {TypeOf(byte(0)), ""}, {TypeOf(rune(0)), ""}, {TypeOf([]byte(nil)), ""}, {TypeOf([]rune(nil)), ""}, {TypeOf(string("")), ""}, {TypeOf((*any)(nil)).Elem(), ""}, {TypeOf((*byte)(nil)), ""}, {TypeOf((*rune)(nil)), ""}, {TypeOf((*int64)(nil)), ""}, {TypeOf(map[string]int{}), ""}, {TypeOf((*error)(nil)).Elem(), ""}, {TypeOf((*Point)(nil)), ""}, {TypeOf((*Point)(nil)).Elem(), "internal/reflectlite_test"}, } for _, test := range tests { if path := test.t.PkgPath(); path != test.path { t.Errorf("%v.PkgPath() = %q, want %q", test.t, path, test.path) } } } func noAlloc(t *testing.T, n int, f func(int)) { if testing.Short() { t.Skip("skipping malloc count in short mode") } if runtime.GOMAXPROCS(0) > 1 { t.Skip("skipping; GOMAXPROCS>1") } i := -1 allocs := testing.AllocsPerRun(n, func() { f(i) i++ }) if allocs > 0 { t.Errorf("%d iterations: got %v mallocs, want 0", n, allocs) } } func TestAllocations(t *testing.T) { noAlloc(t, 100, func(j int) { var i any var v Value i = []int{j, j, j} v = ValueOf(i) if v.Len() != 3 { panic("wrong length") } }) noAlloc(t, 100, func(j int) { var i any var v Value i = func(j int) int { return j } v = ValueOf(i) if ToInterface(v).(func(int) int)(j) != j { panic("wrong result") } }) } func TestSetPanic(t *testing.T) { ok := func(f func()) { f() } bad := shouldPanic clear := func(v Value) { v.Set(Zero(v.Type())) } type t0 struct { W int } type t1 struct { Y int t0 } type T2 struct { Z int namedT0 t0 } type T struct { X int t1 T2 NamedT1 t1 NamedT2 T2 namedT1 t1 namedT2 T2 } // not addressable v := ValueOf(T{}) bad(func() { clear(Field(v, 0)) }) // .X bad(func() { clear(Field(v, 1)) }) // .t1 bad(func() { clear(Field(Field(v, 1), 0)) }) // .t1.Y bad(func() { clear(Field(Field(v, 1), 1)) }) // .t1.t0 bad(func() { clear(Field(Field(Field(v, 1), 1), 0)) }) // .t1.t0.W bad(func() { clear(Field(v, 2)) }) // .T2 bad(func() { clear(Field(Field(v, 2), 0)) }) // .T2.Z bad(func() { clear(Field(Field(v, 2), 1)) }) // .T2.namedT0 bad(func() { clear(Field(Field(Field(v, 2), 1), 0)) }) // .T2.namedT0.W bad(func() { clear(Field(v, 3)) }) // .NamedT1 bad(func() { clear(Field(Field(v, 3), 0)) }) // .NamedT1.Y bad(func() { clear(Field(Field(v, 3), 1)) }) // .NamedT1.t0 bad(func() { clear(Field(Field(Field(v, 3), 1), 0)) }) // .NamedT1.t0.W bad(func() { clear(Field(v, 4)) }) // .NamedT2 bad(func() { clear(Field(Field(v, 4), 0)) }) // .NamedT2.Z bad(func() { clear(Field(Field(v, 4), 1)) }) // .NamedT2.namedT0 bad(func() { clear(Field(Field(Field(v, 4), 1), 0)) }) // .NamedT2.namedT0.W bad(func() { clear(Field(v, 5)) }) // .namedT1 bad(func() { clear(Field(Field(v, 5), 0)) }) // .namedT1.Y bad(func() { clear(Field(Field(v, 5), 1)) }) // .namedT1.t0 bad(func() { clear(Field(Field(Field(v, 5), 1), 0)) }) // .namedT1.t0.W bad(func() { clear(Field(v, 6)) }) // .namedT2 bad(func() { clear(Field(Field(v, 6), 0)) }) // .namedT2.Z bad(func() { clear(Field(Field(v, 6), 1)) }) // .namedT2.namedT0 bad(func() { clear(Field(Field(Field(v, 6), 1), 0)) }) // .namedT2.namedT0.W // addressable v = ValueOf(&T{}).Elem() ok(func() { clear(Field(v, 0)) }) // .X bad(func() { clear(Field(v, 1)) }) // .t1 ok(func() { clear(Field(Field(v, 1), 0)) }) // .t1.Y bad(func() { clear(Field(Field(v, 1), 1)) }) // .t1.t0 ok(func() { clear(Field(Field(Field(v, 1), 1), 0)) }) // .t1.t0.W ok(func() { clear(Field(v, 2)) }) // .T2 ok(func() { clear(Field(Field(v, 2), 0)) }) // .T2.Z bad(func() { clear(Field(Field(v, 2), 1)) }) // .T2.namedT0 bad(func() { clear(Field(Field(Field(v, 2), 1), 0)) }) // .T2.namedT0.W ok(func() { clear(Field(v, 3)) }) // .NamedT1 ok(func() { clear(Field(Field(v, 3), 0)) }) // .NamedT1.Y bad(func() { clear(Field(Field(v, 3), 1)) }) // .NamedT1.t0 ok(func() { clear(Field(Field(Field(v, 3), 1), 0)) }) // .NamedT1.t0.W ok(func() { clear(Field(v, 4)) }) // .NamedT2 ok(func() { clear(Field(Field(v, 4), 0)) }) // .NamedT2.Z bad(func() { clear(Field(Field(v, 4), 1)) }) // .NamedT2.namedT0 bad(func() { clear(Field(Field(Field(v, 4), 1), 0)) }) // .NamedT2.namedT0.W bad(func() { clear(Field(v, 5)) }) // .namedT1 bad(func() { clear(Field(Field(v, 5), 0)) }) // .namedT1.Y bad(func() { clear(Field(Field(v, 5), 1)) }) // .namedT1.t0 bad(func() { clear(Field(Field(Field(v, 5), 1), 0)) }) // .namedT1.t0.W bad(func() { clear(Field(v, 6)) }) // .namedT2 bad(func() { clear(Field(Field(v, 6), 0)) }) // .namedT2.Z bad(func() { clear(Field(Field(v, 6), 1)) }) // .namedT2.namedT0 bad(func() { clear(Field(Field(Field(v, 6), 1), 0)) }) // .namedT2.namedT0.W } func shouldPanic(f func()) { defer func() { if recover() == nil { panic("did not panic") } }() f() } type S struct { i1 int64 i2 int64 } func TestBigZero(t *testing.T) { const size = 1 << 10 var v [size]byte z := ToInterface(Zero(ValueOf(v).Type())).([size]byte) for i := 0; i < size; i++ { if z[i] != 0 { t.Fatalf("Zero object not all zero, index %d", i) } } } func TestInvalid(t *testing.T) { // Used to have inconsistency between IsValid() and Kind() != Invalid. type T struct{ v any } v := Field(ValueOf(T{}), 0) if v.IsValid() != true || v.Kind() != Interface { t.Errorf("field: IsValid=%v, Kind=%v, want true, Interface", v.IsValid(), v.Kind()) } v = v.Elem() if v.IsValid() != false || v.Kind() != abi.Invalid { t.Errorf("field elem: IsValid=%v, Kind=%v, want false, Invalid", v.IsValid(), v.Kind()) } } type TheNameOfThisTypeIsExactly255BytesLongSoWhenTheCompilerPrependsTheReflectTestPackageNameAndExtraStarTheLinkerRuntimeAndReflectPackagesWillHaveToCorrectlyDecodeTheSecondLengthByte0123456789_0123456789_0123456789_0123456789_0123456789_012345678 int type nameTest struct { v any want string } type A struct{} type B[T any] struct{} var nameTests = []nameTest{ {(*int32)(nil), "int32"}, {(*D1)(nil), "D1"}, {(*[]D1)(nil), ""}, {(*chan D1)(nil), ""}, {(*func() D1)(nil), ""}, {(*<-chan D1)(nil), ""}, {(*chan<- D1)(nil), ""}, {(*any)(nil), ""}, {(*interface { F() })(nil), ""}, {(*TheNameOfThisTypeIsExactly255BytesLongSoWhenTheCompilerPrependsTheReflectTestPackageNameAndExtraStarTheLinkerRuntimeAndReflectPackagesWillHaveToCorrectlyDecodeTheSecondLengthByte0123456789_0123456789_0123456789_0123456789_0123456789_012345678)(nil), "TheNameOfThisTypeIsExactly255BytesLongSoWhenTheCompilerPrependsTheReflectTestPackageNameAndExtraStarTheLinkerRuntimeAndReflectPackagesWillHaveToCorrectlyDecodeTheSecondLengthByte0123456789_0123456789_0123456789_0123456789_0123456789_012345678"}, {(*B[A])(nil), "B[internal/reflectlite_test.A]"}, {(*B[B[A]])(nil), "B[internal/reflectlite_test.B[internal/reflectlite_test.A]]"}, } func TestNames(t *testing.T) { for _, test := range nameTests { typ := TypeOf(test.v).Elem() if got := typ.Name(); got != test.want { t.Errorf("%v Name()=%q, want %q", typ, got, test.want) } } } // TestUnaddressableField tests that the reflect package will not allow // a type from another package to be used as a named type with an // unexported field. // // This ensures that unexported fields cannot be modified by other packages. func TestUnaddressableField(t *testing.T) { var b Buffer // type defined in reflect, a different package var localBuffer struct { buf []byte } lv := ValueOf(&localBuffer).Elem() rv := ValueOf(b) shouldPanic(func() { lv.Set(rv) }) } type Tint int type Tint2 = Tint type Talias1 struct { byte uint8 int int32 rune } type Talias2 struct { Tint Tint2 } func TestAliasNames(t *testing.T) { t1 := Talias1{byte: 1, uint8: 2, int: 3, int32: 4, rune: 5} out := fmt.Sprintf("%#v", t1) want := "reflectlite_test.Talias1{byte:0x1, uint8:0x2, int:3, int32:4, rune:5}" if out != want { t.Errorf("Talias1 print:\nhave: %s\nwant: %s", out, want) } t2 := Talias2{Tint: 1, Tint2: 2} out = fmt.Sprintf("%#v", t2) want = "reflectlite_test.Talias2{Tint:1, Tint2:2}" if out != want { t.Errorf("Talias2 print:\nhave: %s\nwant: %s", out, want) } }