From 81ab4a381a41c08fbbe2efc4aafcf5c7243f7e08 Mon Sep 17 00:00:00 2001 From: acevest Date: Mon, 3 Apr 2017 14:09:43 +0800 Subject: [PATCH] ... --- .../Protocols.xcplaygroundpage/Contents.swift | 181 +++++++++++++++++- .../UserInterfaceState.xcuserstate | Bin 29904 -> 8024 bytes learn/go/interfaces.go | 2 +- 3 files changed, 178 insertions(+), 5 deletions(-) diff --git a/learn/AcePlay/AcePlay.playground/Pages/Protocols.xcplaygroundpage/Contents.swift b/learn/AcePlay/AcePlay.playground/Pages/Protocols.xcplaygroundpage/Contents.swift index 59ef2ef..8b4a182 100644 --- a/learn/AcePlay/AcePlay.playground/Pages/Protocols.xcplaygroundpage/Contents.swift +++ b/learn/AcePlay/AcePlay.playground/Pages/Protocols.xcplaygroundpage/Contents.swift @@ -109,10 +109,6 @@ print("Here is another random number: \(generator.random())") - - - - // 类类型专属协议 protocol SomeClassOnlyProtocol: class { func haha() -> String @@ -212,5 +208,182 @@ extension RandomNumberGenerator { let generator1 = LinearCongruentialGenerator() print(generator1.randomBool()) +// Mutating 方法要求 +// 实现协议中的 mutating 方法时,若是类类型,则不用写 mutating 关键字。而对于结构体和枚举,则必须写 mutating 关键字。 + +protocol Togglable { + mutating func toggle() +} + + +enum OnOffSwitch: String, Togglable { + case On + case Off + + mutating func toggle() { + switch self { + case .Off: + self = .On + case .On: + self = .Off + } + } +} + + +var lightSwith = OnOffSwitch.Off +lightSwith.toggle() +print(lightSwith) + + +// 构造器要求 +// 协议可以要求遵循协议的类型实现指定的构造器 +// 在协议的定义里写构造器的声明不需要写花括号和构造器的实体 + +protocol SomeProtocol { + init(someParameter: Int) +} + +// 在遵循协议的类中实现构造器,无论是作为指定构造器,还是作为便利构造器。无论哪种情况,都必须为构造器实现标上 required 修饰符 +// 因为使用 required 修饰符可以确保所有子类也必须提供此构造器实现,从而也能符合协议。 +// 注意如果`类`已经被标记为final,那么不需要在协议构造器的实现中使用required修饰符,因为final类不能有子类 +class SomeClass: SomeProtocol { + required init(someParameter: Int) { + + } +} + + + +// 如果一个子类重写了父类的指定构造器,并且该构造器满足了某个协议的要求,那么该构造器的实现需要同时标注required和override修饰符 +protocol InitProtocol { + init() +} + +class InitBaseClass { + init() { } +} + + +// 写继承列表应该先写类,再写协议 +class InitClass: InitBaseClass, InitProtocol { + override required init() { } +} + + +// 可失败构造器要求 +// 遵循协议的类型可以通过可失败构造器(init?)或非可失败构造器(init)来满足协议中定义的可失败构造器要求 +// 协议中定义的非可失败构造器要求可以通过非可失败构造器(init)或隐式解包可失败构造器(init!)来满足。 + + +// 协议作为类型 +// 作为函数、方法或构造器中的参数类型或返回值类型 +// 作为常量、变量或属性的类型 +// 作为数组、字典或其他容器中的元素类型 +class Dice { + let sides: Int + let generator: RandomNumberGenerator + + init(sides: Int, generator: RandomNumberGenerator) { + self.sides = sides + self.generator = generator + } + + func roll() -> Int { + return Int(generator.random()*Double(self.sides)) + 1 + } +} + +let dice = Dice(sides: 6, generator: LinearCongruentialGenerator()) +print("Roll: \(dice.roll())") +print("Roll: \(dice.roll())") +print("Roll: \(dice.roll())") +print("Roll: \(dice.roll())") + + +// 委托(代理)模式 +// 委托模式允许类或结构体将一些需要它们负责的功能委托给其他类型的实例 +// 委托模式定义协议来封装那些需要被委托的功能,这样就能确保遵循协议的类型能提供这些功能 +// 委托模式可以用来响应特定的动作,或者接收外部数据源提供的数据,而无需关心外部数据源的类型 + + +// DiceGame 协议可以被任意涉及骰子的游戏遵循。 +protocol DiceGame { + var dice: Dice { get } + func Play() +} + +// DiceGameDelegate 协议可以被任意类型遵循,用来追踪 DiceGame 的游戏过程 +protocol DiceGameDelegate { + func GameDidStart(_ game: DiceGame) + func game(_ game: DiceGame, didStartNewTurnWithDiceRoll diceRoll: Int) + func GameDidEnd(_ game: DiceGame) +} + + +class SnakesAndLadders: DiceGame { + let dice = Dice(sides: 6, generator: LinearCongruentialGenerator()) + let finalSquare = 25 + + var board: [Int] + var delegate: DiceGameDelegate? + + init() { + board = [Int](repeating:0, count: finalSquare + 1) + board[03] = +08; board[06] = +11; board[09] = +09; board[10] = +02 + board[04] = -10; board[19] = -11; board[22] = -02; board[24] = -08 + } + + func Play() { + var square = 0 + + // 因为 delegate 是一个 DiceGameDelegate 类型的可选属性, + // 因此在 play() 方法中通过可选链式调用来调用它的方法 + // 若 delegate 属性为 nil,则调用方法会优雅地失败,并不会产生错误 + delegate?.GameDidStart(self) + gameLoop: while square != finalSquare { + let diceRoll = dice.roll() + delegate?.game(self, didStartNewTurnWithDiceRoll: diceRoll) + switch square + diceRoll { + case finalSquare: + break gameLoop + case let newSquare where newSquare > finalSquare: + continue gameLoop + default: + square += diceRoll + square += board[square] + } + } + delegate?.GameDidEnd(self) + } +} + +class DiceTracker: DiceGameDelegate { + var numberOfTurns = 0 + func GameDidStart(_ game: DiceGame) { + if game is SnakesAndLadders { + print("Start a new game of Snakes and Ladders") + } + print("The game is using a \(game.dice.sides)-sided game") + } + func game(_ game: DiceGame, didStartNewTurnWithDiceRoll diceRoll: Int) { + numberOfTurns += 1 + print("Rolled a \(diceRoll)") + } + func GameDidEnd(_ game: DiceGame) { + print("Game lasts for \(numberOfTurns) turns") + } +} + +let tracker = DiceTracker() +let game = SnakesAndLadders() + +game.delegate = tracker +game.Play() + +// 通过扩展添加协议一致性 +protocol TextRepesentable { + var textualDescription: String { get } +} diff --git a/learn/AcePlay/AcePlay.playground/playground.xcworkspace/xcuserdata/Ace.xcuserdatad/UserInterfaceState.xcuserstate b/learn/AcePlay/AcePlay.playground/playground.xcworkspace/xcuserdata/Ace.xcuserdatad/UserInterfaceState.xcuserstate index 957e76c24042a8a0efe63b02a4286519828247b0..b35f29100ff6b97f21fea7f96da6e7089607c721 100644 GIT binary patch literal 8024 zcmb_gd3+Pq+J4VTlS!IwI>{sx5D64Smaep=AWB!TQfh75Qr0j{h7w4VnoOZ((bokK z7jOkPlokXO6-AI$^a}2xA_4*zQN(@4d)@uK_cxg)ZT#@Ne!t(%Kgr~r^DfVM&ig)R z8e4*asGObs4iKQAffUe!jvl4&HVl|6MWTUls9`|3akk`>qmu@R5#Ox9Tq#mJKn}NX zK$fi8%)S8(=)ned;GrM%hjbVK17R5C!f+S~7sDk`0;MnxE`>^{hI*I?KDZJh5Cs`p zVJ^&rHfV?WumG-xTVOe?fYtB-JP41$07 z44=TK@ELp#U%;2}710tMVThg>NGdTB6EPDDu@as*NN?SXg*U3S0m>eU=$q90boFSi*FUhy$pA;yelxk=SWoa7asEyjG zllGzK({wtN4xY*!ls!pcsvIf*CAGQPT-5q+tqXV!fBOSCo}c3`gcfTST8! z7WTC^OCj0I4k#U7UYuPrvNU64NqK2TUO~yojFAP|#TjL#V@DR|7M70~Tbvhn?10|j zUI$JPzy-Zfi#lXbzYflWK5#ztMFZNA#|%vOvO{qAdB}jsbB23|$9< z;6fM-LogN1XvH+N9fAxnLMCKEHsmNUHHuMbN|h%wA_YY`FjqoA6B@nj%$b3pG%71A zt1c=Dt*i3X)l_yu0Teb=c`lEg(4Gm5 zjsSfAC-$iFZUPML01IjquBk`z3h;ot18UIG z0k!BD$W+Lr@<*Xh+)4vXQ_fe6&oHQq&#CKRI(T6Qh$!Fy z9E3wKJ-)yXv%&okNH7zcU={?>g}tyho`-!Nf;kX`W(YwT&&R&##(vm8b}*|Wfo3t% z9zTS&fo3Txi_I-wcEBHo>I2b0V^AucB}PP_EJbR>P?I$6(tuwo4hAct(N-zyWrbp& zPl`svk@n(HC@hN#z7qp}d6t(Q_y>C)DJc15$)9X6y?F2K=P%jP^7hmPIR(QDhq-gJ zhZii;rx!^xK>5@!$R6g-UZif&LRjQwZHX-^3&i$QjI^(Xg>V%VPOb8E{})FIVacDO zv=naWLTMmg5JxE%(){$DXD2DXa|#Lz7sYMe3M*AxvtpPlh@Th3yw5|h3PNxXG(#9K z#C|v!-3sC{TkT`M3r}5;n=>MRm^-I%#PEcDgP72EAn?^0NyHN91PYmgkpei0pDN+qa^uJXYJK zbNleJ!+N?<1MCi=E)=-3RjTkyAvrKJAVs{aE0IQRI2>#gBNfpuHhWp2drWLBNg8r4 zSddq!ux*%oL2iCd?l5;wUe1U`i_~NP8XV|=t(b#_DjCPao1IE=h=YF+j)Qw6ybXuo z9XJd};3&Kc$8Z#0gro6dyadN!5f*QR6VMkbtA;@m)!D2F4{D$2^$dQu#bL@%4s6PqOX>*PQ%Ah#>i zJT1Y1Tpy6;sRk3qR1-n4srCa(9dHy!qk*U_#(RFWQfv>m%3ikD zpSQ+1a9_jE;C=+Yfp6g~d@a(qbDA!%h&V{22B6zP$_BZ1$9uwU|eWHICyBmT+3 zSj4pvNm3A2@>5avvi5paL#xl8*2d*MQBNzYuT3OaAxq8C z7-NYOhISHxxbO;`m}pkyJkl4qPSS^*k2UD&ByQ3VYq1XNr@n^qi_|uuv4kO@fe4Yj3gJCBnumGk|IQ{F+kK!QPN5;nyOlg zugxO`N`Cn`rGt#XsY-qWRj9it^=F{P4O~PnRt${BX&vMeoQ~1BKS!p)gtOG{A7^vgZuvZ9FN`_xRLz@1yY5Sg@g zHNR#Ibv3{GSTDV4{w`-y^E*ryk*mN+t|myXA=i@Y$n|8gmu2JeREB*qRWiLh)@o7F zCu~``Sq$_@LFpSIztnd5%=p^wB{(0i#D&;`?Orx3A?=bdQq5&1T9`+UwEE=Mh@>9I z8{j}ESw?Qe2+qaAL*y2+9E`+EZY8%(?)Fm`ivXi2W9y_u>11uOb4KnWE4}P_O1Dhx zsYi|kLQSz%)nXvhNmfDOf0z^ZeGi-_x8Xc&!`6viHyjphSN}`>93pGLNID>gtc9#8 z{;n%yT}|aAIj$Mehzn3H0c1Vd;AL%P^|f*A;<$H`jY>r48d8&bglzJ%7gm%dquHHd zGHW}@ql&q|Jpcct#MPbJtenp$@ME(rR!4*uRfzwuAzX%l*Wk@Z$R6?x z7|CApEO`#H$ab=i>?bdf)eXK`fuKJkh3Z?xh!m2i_!PS#SvmS%)*aueKLc<|I1-5W z83bI0H?ah-?Rkn`A}_~I(Q9}EUKb<%QWcm33WeVwZ{qd1_zx6T85?KTkr=a<^kmk# zd8INaDOK`5WRZPjHDr<1cq0Pdq);psjN~I_Uv}a(T>^}JMn3nlgZ@!^-0R8I|fC*FlCan(9Sic&KuSH(8GTUAfJ>%~YwX%A6F1}K6gS|iS@7lW~@U$5lR zuGZ)Ag<~{K8jLLuN8~ao>Wc(g=tRvHdP!$E0mASg>QwHS9Wh886efR@to zM3!T51E#A`R45r;M#tku+|->>6}=)Uyc+7khw%}tuTC$zZAVg64Rp#MrcT3$@lmW# zFAA+mnkiC0xI1Yh_2J{VxsytCCO&~r#`1`7aN_FVW!;HJsJ!Dy3}hxc-(Q##MbWY8MIWEKjNYVB;zr!v zL2t%Am>zG`)n1nG(V7aB7Zt;Ea~H*5EzsNPoe3v*;j>sDH+eU`H(~NVd@fOc=mT_( zGVmb&t;<)p{)n%Ah;B$2-H7|Tjc%fkCUbc+eKNu2E%-v5%iCb+TKY8IPIuso_zJ$> z&F9^8ZxTtLrO)9@__6|yasy86fqG|XDN5q)3-slr#jns;@l|{c>yz)w=|vrPC#`#v zzMZu05Pc30bURJlZ`He;waPPIYM1(mCmE>bOF7dE}=Kj8|lq-IenP!rti{k=uaA= z(P*?9Mq|(zHG;;i8K%k9WNUIY_i5H?Hfwfh_G$OX@%d|IZmuqj;KBIkAdq{g&dsKT& zdqR6g`?2;@?dRGrwO?z0)#-G4U8>Hcv*=h|Z(Sc2Pk{g`1)CX>zNGI>k^Q_Pey<;*yyf*H?DVCtC}Of%EQ%x4xd zS24(3%iO}OU~XgXVD4g8G50W?%w}c}^Aht4^BQx2d6PNF{GEA^d7nAWoMAp@K4s1_ zzcc^RoAkZ)ee`|x{q*Vjf%-xE!TLh|DE(;tCHf+LiM~ufR)48}qJDvXkN!P_*)Z5p zW|(ehGR!sv4I#rk!$QL{!@Y+44G$RB7&;B>4C@UW4UZUh8=f&dYxtXCpWy|=ONLhr zuNe*)jv2l*{E|8(_2SfE>eZ=tr*2DqKJ{qovD6c(CsR+QevtZM>PM-cq<)tAg%OO@ zm}1l!^~O}A$!IaMM$TwAI*db%rN%1bRAbb5m2s8vG2>gt4~^d%|6%;z_>=J$<8LO` z>^pE7@7{?`1R`Jd(=%s-ibG5==%-2xV~ z#bwE}Tx#)KuC*+;JZjl#*>8E#^0MVs%j=dmEXOP-EGI3eEFV}tw0vaw+VZQFwWeEh zt>sqH>a$ALCTqYt$GY0O-nz;9n02%DN$XzgE7muy2d#&!hpnfqA6P$U4XlODU`Mf| z*-O|W_EPpT*2B(VgX~BQ%rHxCgPV=PIrAB)4ospjni{Oxe?q*?jr7DZVXq<)pHHpWNs=qotwc0xDeOE zML3zehP#ei%q`{a+4k68vAu13$9BZ_uI;$(L)%BTPi&vrzOa2|`@wFpyX@)q zZ2L(2MfQvBW9-HD%j}i*DtooP#$IcW*jL!M*k7~1V?S&^YCmKD#QvH6OZ(UMZ}}A7 z%yYb*cklu~kRQSi<1_i;d_F&dAIX>S&rekMPQpUnsPx%}1q&HM`fHvUe2 zC4V>nD8G~6#qZ{y;a}ws@Ne>O^Y8FS_*48D{$u`A{&W6E{x|-22RO72#$j+69VQ3w z=d6%LQ1&N10B)iK>M!y!9XId(Z-a=ha>;&|6_-0^qE zdye-VUpc;UoOS%e@x9|m$Ip&mot(3ubGUP&bBXgI=N9KS=XU2V=N{)?=UdK`&i9?C zogX-9Rhg|Kj? zAPaMaHes=_L|7^;6IKfM2=@sO2y28+VUw^$*eX0N>=1SdFA1*;ZwPM*hlQiUG2w*p zweX`W#bt0AU1k^Ovb!8E!F7Qv%Qf0n>?(DYyDoE8x~g2&E}yH_HQ$A?ZUB^aeVE`?+i153&Q{-OyUgA3@RdaZsxwGX{MEe zlBuO;tGSe!Vrgnxw%KCYzF4WHW%WIGE`yM1zOR1&H+&vp=AQf8_jAv!YiTxEtg*3g z0tgTw00}5Sv+uC)R)tT|n=J;Du`1kDcbC52YN-y_nd_SjQ}pJFaI2}s9l$y3x4WS( zzyKC_08iirhJc}97>EQ>Kni3a8pMD&kOE3TDJTQwKm{s*8fZWzr~+nS0anlorhutn z8fXL4K|7cMIsgY|gN0xbSPoWzhruIY9as-Gf@i^V;CZkMya0BCJzy``2abZ*!7*?g zoB(ftli(D16TAgZgLl9u;8XA=_#T`GKY)wiGPnYM1;0TE5u~9bbb@Zs6Z%3i41rRp zfJtx!91YW8I?RIkuo#v@4XlLYVGV46MreX9a58L#bKyKVA1;6k;Uc&gE`dwoTKEur z7(N2m!S%2ccEQKs<8TLj67Gc0!sp=ga1VS5?uW0#WAHdU0pEZhzz^X^@MCxuo`YY* zZ{QE`GQ0wRg}=e8h(r{kVI*=ugOCV$BOeri!jS|;plB3>Vo^LAjz*&#l#B9E87fD$ zNQdfBJ!(LD)QYB{sc0H%L(@?^;?O;49-5CaPI)gq&=g^nvJ9HjhBxr&mSi*sDB%BCm!i8`p+z59 z#Jj|M#QVfq;xpoN;wRz)agod>^T`6Tge)a1NHtkajv;GEEm==CkWHk4oJ1N)Gif2G zlGDf;WCzKS_mFeQx#U7}5xI=Kk6cNvBG-^>$#vva+^W-ja zFS(C=nLI%DkcY{m}!O3A2bDu#-sMp2`wG%B6SpfV{Xl|`wj z3QA3Bs0K<;O`sa7R%!}0m6}G)q2^NasQJ_aY9Y0VT1>5_9-#0tvi`qdw zN$sSbqV`iSQwOM5sDsoYs)ssEy-K}Jy+gfAy+?gXeMNmuU8b&3zf!-^4zwffL_5=d zv_Bm{52gd@AUc>1p+o6dT23qII69rqpfhPDokeHUIdm?aM_1BSbTvJOZlVqJUGzk{ zjh;@o(=+G=^g?in_o!&veMDM3xp%2oB=pOnl`ZWDE{SN&u z{T}^3{T2N+{SEys{VV+&eU<*5{)7IL0SsgiBVybbcgBMWVM3WOCY+Hl5zG)Kfk|YN zm}DlK$zgJtJf@PVVyc-jOcP^Z?qa4fZOnA0oteROFf*CE8O$tUmNLtj`K4U&-E;5&xpIMTnSej*6mUUnqStr(+ z4P-;vFm?z#l$EkFR?aHeL^g>X!H#6p*mSmtEoMvDQnrjOXH~40tz~s=9cyGwYzsS? z?O_hCs>?7UrpS^r60>6CGZIr`V-vL^&pc&T zrO7mI3NU$?@!Gkcu44!~9a6}Cc-C%4mP0cpzCh4`JkUV8piMc^<);IKFtx>o}Hd0%ScF0j!jZ3va>Q1wIXSM z00R1J2-HTyejfhcvido|qgf4Ngf^bab4wX*CuoI)NB7*!3ic2MHh% zB#jXiYSc~AR|$XWEtSQpbhBC4)&&wla#gXa#Fl;S3K|ZSAYwBZ0Y-vUFba$YX&@bB zfJ`jHZrB}rU{CCYy|EAW-3+ooILHCHAP?jN2`B_bSd1s&V!Rzc%Rz)QIOxnl7aTD@ zPnng~V6d9Z>1Mr7D-z`?vs6u{sl~b}hDM#$WY&tj(=8T*#i}z}g@u+vU7M-Zsujul zOMZar)K){Y!P>@yRJAl4tQv!UssOtWu7GZU@&Me#wG#cnGexNwF9=;)S>yZ^ILCgjN)+)KAd0Hd{;i zs>x#28?EK~7PH=>H(GU8gUM*oioE;eTx4p{YgJaAu|a2U7}IQ%WrbO<=QY9eCJ0$8 z^3(`5nDANES~tnmpdTZAvcV8}4TRadUMup*Q)cy2q}127HVUG4v;EzuH}}&BPgQBN zuC38*YBe_WTP)%!vERVoZ@0mj;BFAHem#y5?D!rqODpmyRu#2cb#={prJAGi#|j*W<8cB`#7UdLHn1J+08fG^!BgOAoQzX&7S6+YxB{zj#5mr@l{%}gqOCf1o*cO$=_Q3x)*Zl3*vZh(}M!p5O7CXn< zuc^xmwIcs|)1+u!OG~ppy1^RV(q}|1x<;~ES6SYv68>sWLNFLyTa1< z&E2tk$d?Pk()6`}{~6ORPf$pMlT%VU*y?t9Y(lIwIJQIZhkL=>UA*1D1>Obk0VnW2 zI0HTaAA*m-$Kb41B(k$rXsWkGhMH^Q<>Qxa#U!1fpVaw$WNgq+E16)w_u4JE6z5jgtS2NYf4Gw?ai#f7}Feg(b; zPT)!KE%{MI=Ip8~7go|-OWqQ4yk5eMxard9X&na*fIDy~6AK*_2 z#y0fUGV1ceYOCF3a2YPgKr1p%Ff{9j$Hc^_Eqb#hMpv(onQAYB_)omxVw&|jvoWR@ zkNtN)yN)T
%f*YO@bt$v{K$Jk^62}o*19!gDxU2S%icR`95!QWjH?qndV6%GBX zBCm;bppSP!2Oiuluh)tq`z)ovV2u_ciJi#kYuSM3_Y`ynPS6DcI0*c~7o~MNi+*ge zD%z}X*6}qI23Uj31iIa!hq_p$E-&nY?jYG_U(gFEI-xhN!me78m#sjGwbe)QidboI zLUK|^$D7a(`ojR=1P4O^gJ7^$ZtU@Z_6Js%-FhxF%dZVG$B9O}$c=~Bp;fimI z5Hha2gzGTCW3c`-425C935G)njDP?RhQnYai~?7x>YEJB4Q9Pj)1ou$jn=XCJY1ud z53yQNu-&L`B>J%?v%#L?F~D`WK?L#Gey$H?Fq(ILD91WH&gQALf?VQ&q6@~u1Uw$s z{KfACH|uo*IMU_>+Wt=P_bwn9`#@H+A%Mfc6$ro;T#o^6z(7D>z^f$)kLfK(VF@hN ziiX^d>2KU=;(m^!*}5bJ7hgH0QU`W0&Ij$cp`4blQzJ+Kn`riMqG^N{~y#6(9G+~f=zw3 z1e^kAf{0CUDx3z};B?pyXTT2Jf+u4$wqPr6#ZxxHyCH@gya(O`?}fARR6Gr1JPXgl zbMd@?UoGKtgIdC_g=KIhaNh{;gUjIxct38#({VeVu@SC<4*&^#5O?62I0N7P5B0$`trl~ z!6SGXUWL2x1{_gUsGrc=Qt~ZOUq92=zl;$A7T+aRmm3Vw^PQtf&G^gO3@GW>6 z--nmu75M&*Kmu~$dmtQV;9|T|=`%eO?9a@|youGv;U`VG9=+Zd?o zO}6AQ;G*qzli8}&Tk6e*7QSZEio6Fbu|ek(k07>BfMWeMkN*sQ!3Vg{@dKUkOT3y7 zaBfOXMIYyUac>cB{1%??g5SaK@q_pg+-Ya}M|csqcfp_F1-u5Y?Shx!&-fwyFjkIN zYAUW3dVKwX z9f?x$llbXt)TW`#0hpC23-82FVP$Dp+QQ2Nh|EVte_2|Bcj9NTGAu3Cw$QFaq(apo zq8n8pHPWC;RE3|z&*NSA1-!c(jX`74I5ZyB;63;R{tTbTKkzaR9uOe<<~h-QoyCop zWazB*P1y!xgH|;7Mo`)&)tQ>LA~(A~^&z>5*PINauXg5M3K&9KLw=bQAX7kQ+FFw?X=HMP2VQ;DI z3l^XyAYubrh!&y6_%MDIzs7%9h!*0*wto?&l|uBlRF~^5wme|biaf8?^oqn-X>f94 zQeQwvtI?W1^48+lvC@v~5wvcgBXpsSeJi{1@oOs|Lz@S#d>lOsA~vHZ&^ELk?LbeW zo#-j_Gl$U!fl-5>|P2Ex&c_&r>Vi}45eBV3HT z@C5uRuXVm>?z7B3J=ryEZ`&-kVM~F&O{h)(=7xHHrd?{X82AyGF!AeKRm5Aq%G$=y zkom&7@4|KX%1u*k-7+s-emZ*n%5r^6v#wsBZnc^Xb*)x?gV19O=G(WNcQc`n8T_|U z`0K(Lksku~-ImvAG@138I*VQ_3h#fRkI+n0bF;3+qHoACn_64?-0lc^omb&e{C+1o zhR@v07Ehv6y)#5~8aRO~=yx$vCSUv*-`=CXXtaSXi#7N5pLRmK0{yF zX6?dfVd+=sYpqD!xAd=~-hjSA-|}6`jhARe?!~IV-e>3cdwfp7^8@;kpV8UJr*>X9 zpr4R!PICRFeiE>I(oE_f6u!BuW2Fj_Nke#NBA~dXE5r`mJ(xgo3MBCH_LJjdNcocK(A~3 z&5FM9lK_X0aDTHZli%Rd_u}&Fw`LMQ+_&n@M!Ti|9RPd%WlJCyVYgvGur0M^S7H!6 zzaDqqI7#*8v0nKS9z+m`*h+Y!Cc>NWA$$oj;Yaur0mNV;5dVnx;h*pYd=X#5KjUBU zWqbwyx)n%>5F(Ta1382QNQfbT|34CE;NS37{0A<^fATvp0B7*OAg=*_V=2pQHktn# z>$M`cJY`m&)A3Vai|}0^bGCUVpQdazWJa6d_O{ZvS15v3`9iigS=p33iQl8J@bN=e zKhd^j*9*B18xN`XyI$Dktww&nChU?4S?YR<-TPB4go(dN6>-VEyJJK$k+L5DZgUA@ z1Tk`4pF^nh)(yl6A{8X7i&ZMURnXw*-sO(KiO8^NQ}{ls-}kw;zwIh4Ad2jT7E#PW zqPNl_%Ha78L^+`%DmX}Tkl~=_sRNvMX2^#22^{5 zj%XNgyPlZ9L6(CKSUGUhEi7%-fWn%XNEip)Y2pz(^+VjZ{Uz+|XnO~n|7Fi73^q&6 zrWU=K-&4D8qNx>y{`1(=F6t@73=q*xOeLlfZNzkOrvXqC+g1cMqll2n%$TC}1;_F72T;k9T*e!W{k!g9|H zvtBo`#bhvAEweGgZ>;G%)uZIhHx;9gAxu7!JYj&U}81j0dvs%|9tk`pNNMAB7C)?2?J*X zw>1FIZZ+EW_^vmT0m!=qT0#cD7%UT38P&~FmZ2WUl;?jZV-7TfM- zb7qsyVEjiK9v5f`)Qa?XkcJ$+QExWX|AY9S6mSRMS>2bKO;%IAsres}KPw;))r#)A zgN)m)EkTjt3lUnm~Pv7M064# za4@!$_=tlF9ML}%pA)nq*NRjFwenx4Y}@{q(Q1jdOf^ifHv+^L#JBup^RHua;ydDd zeoW56I1a|!2IUc9wt=gGLcLolgSivI5~nGNv4vc$kAjPnNDVq znWU0~_i%6_2k+FsNs%ylTZL>Hk&N1X8ldWD_JF=PW``)>g0F&$`akZmWjAB~zO$ zpw77t^?#W&>{f1@vD}>NDFW)e>r{SQT&r5^gx#-yz}_xkFVKn%chKOnjIERS$CdcU zF>lU27VsBoMH2_&zb)?7MytWvtZ$GgVtGwmM?$}Hft)Q+P;#9FZi@op@wwh-qi>3T zfq=j4I@7x?{JrD7>o5=S_oV`A)twc7-mMqzi9l|4FcWPN1OvI*YrlU~?-Lw@1LN*NRL71O1)kU80CpTo>~CYhb@X zMWa^KdZwbgvcea=MkA{@wdjbuU?`)}Y>&4bb0)ESN3b-x(-`bFx z>>bOrYDJR=y54Qsec#au%gx%1{)X_CAcU#cIl*nwam!Bdy@0;$x(IZe=>LNVbU`4Y z{kjZ%TV`;p9miz>d&ixXf1a^PZ#G!@qY~GJfdS$7cLDv~*ZIJ0$^X`TfIL8@HearCtWFuasm=18;*?OAy7mkl*Dgh?H!oPvJ}*v_**6~glzKn zsURwtgNr!0n1f3=xRis-x~WjmLxlqg6~V##c%GN@Jg@k-@;r0JE0-g8SGOw?rNPN@ zu^k%z@#kyY%BdutTLl$I#Zw7XA_rG;a1{q1;NWTwKG;nqgC1(Q!0j5I+qM5{Zl`v) z#i9$s#5^S>xlgItRN>8)S_FEi5+I?-Z`BzL|4M!?V-JwI?Jc#Pd&% z$0v4FwBvPs9GSQ>NwcRBk1B0Y_K7i+m&-LV)nRpMM6>nk02$5 zH_Q0gxc-W2qKr3JlnL}ulYxY?aIl+4@Fl%^#1mJ^F4p z`Znrr9{O~uoti;)P%}BWnS)z6xRryCbMT373WFZ%9>EN@@zA&btIc5M&Z85{yvMf7 z6M2CuV|E}`z{8C^;(qwb@YQ!6<5BnNkL@F@;H&B157sg=|!AOStRcR$O)=Wqtk z?LT?9{4lVv($6c^VBX5?&aV<4!+32mpHh;o7xR} zsJ%c!y~x3rdEf_l;II5!1LQQtant+fs@vleq``41d`6Hbq$Krc_%-Up&87JU=%G#l z3H25S5Ah85@C+aBmFAS7i6aGR^5M6-T_H~xAkO!xvpjU#mSLIR94jQ)du=)P6Y5jD zMZU(tBYhUhAA9W@GvtrLN}Ku<`fU6g>c^Wy{E50?gZMKCU*{nIWOW(`j|;Kr@l#)Z zbJS)~@>qFCRl7WP0JT?XbW`Qi1n8kDAfXu!zQKb%$;;xD4feEb&E6HxW7^{rlBK~3 zaXj>-_&8~Byq$8|h4ugu-Lxw`h!)Xqv^xji;^1ixzRkgRIQVWi?Fo8lZy=$4IrttA z{e2$#nSZNkb*N8ozp5YKE|7ozjf31(zE%XK+oggRSy0x1cg8T!4&>iiErOb>*6HGRDs>tq=b&D_LL+=|4_1m zevp^tbXz^s-doWK<;)hoqM_IHg;fOp5>{tE`n-?$kll&8=*I-D@C9;QZ;33_$E)}f zncjR268a0IsokpgHLZ3?PtwnWh)3z2)L<&0x4A&1t+`m#*IztJ?*cvaZh8-p(EB(< z;WQ4>9Aa<=hgcj@&7bVcHZ?a`dY_}G58$&}(V=$7;Nalk`ruUlSMX5Vr~W^}b^A|q zaB6U<@T7Kh-@6p}GiAZ`CbL;@X)zfa493P_t0}nFVm0R(r`3jz7y#4ELui*L%B8_c z2_1jAXbDaYmS0=nVY_pf@P%+=tTb2=pOj+1k-s5!gkuL^ZO@+mdF(vi$5Z&yEs3vI zQ{;RZ7uOfo4%5eYTYi;(jXpvjrC;ZeBZr(g{ zd2atb&+WDw$r<{Sn+JhUK@a^IkkDUn$c?uSciuESdV_#z){HHJSER^e`5=(eKRA9z zU*HAzJ$;`3f&P*Hi9=o-^5&2ahkQ9C?xrt-9{Oh>p)YgDkB9Bg!w&d|AaIjH_P>(p ztyaJLru=fY^Rpde`Nk=ZuPAt1Q6%!GR{Qb+Log0E6({2edKhOQVO%*B$g>>8vmD$j z&c;S-n;=ekvVspX$pe6UGJYVUoAF}286U=%5pyV%Ltz{W=a7U$5#5acHA5WouQ$Yf zjS=P1O9uBEA~TeU<|RkpsHJ6MKo27a5+;sA!+6O>@{)_PNp5ae{s#^x#y5Mx6yEjusm(z!A1DSWA(Ah%`e zfrT}b&)6z~8)j;z4D>K6AYs%TlJnpdJova?&CkplAr>^BVC$F_iHZH|0A?&>s{?M> zF*9|bhiR~N%qW3}p2+9w6*lNIciva?ZOY%Yr_4lVGH+1L%p}Ihn3xt0C37f+L&G^V zfn*1@k!JqhtheL`4c%P((v(4g9o}OV;ntj%}AG#PTgsQWD=Dq@>8D!Et@rj(M7~_1ic0!`+~V*$X7hiySKA z5ft+XN^A(`c2%diEFRk)7t8ltDapxvlMu%@UDqPyLFNcApBr29QP9I26D+xmhhN^` zl9%{~e{O3R6B88n1kJp~yaOV-nA6PL9ID`uri*!(d5=R?92z^|QAtMFTS98>9eO!J zzbzX^*g8U$T2bP_t)qb(7B_yMkUbE7!F+eqa)bGvIp5o%qiPO~>DQs}^*mQ~@#yz` z{j?qAFU;?}(O+h+FuyXtF;_V>jzi-)RKp=Hhibc-KbSv(gc!#n4(T{l$4i{%Q2jqR z`hS&fZ<4-mH52dk*i{iabyROTo@|>i#wPc7bJm6R0uh^7S9TC9V%=DG)`Rurke)-0 z95QfdB8Mh%$i$(^n^1bAIJ9Jd5wRh*{Sh=l zD;j?@Mc?vkq#$^#ObxBJmuB@^u(lV*=w_X zH{3Nnxjr^FHn!0iQxP-Z%`gJWmc|%e>oh~NL1%6g$h5>{B`9O%2`LFOMSQYC7OzZD z$}(b;qts8)H}ePKVoIBJ z)(Ix_Buk8;w8>=Ds|=G`oB6k$@$Uq)UFo;D&`@XAncHG)C(3N^7W+RyR%$lz$J(yp z?3KA76B++v(bQ`%Xz9IZX_%O5XyF;M*cnQRj_bW>)tMXh*3@aqiQ2??neF9%GK0yI z5*^pyTw(=tY1WEnTxTsd-T#L+atBCC5J)m=MU?{`W?(e_kDZj?L%rTThYQ$Ru5-`Z z#AbVD>3Vdd1$5>+jjn$*5VmC53^oTuY-BT8C7Z=&bI8h}Rt`1iBl z>rK*kzU95;q~NJ}dgKFg+jLr%n!#5w z9kwc_WAX(*hd+fRnrItJ^K*y33Wlv`n{Fr*1A7;cu+1F0n?slf$?+ifdRE4NyYy;r zUQX$#YER(%l*B$N&FoYVv9UKn_fOBY8`)`W8<4Q=9GbIR(RGBt@*!wytp^Gyu$VX_b&Dzdx%31ap>VL_AvV@haTb3I;>Pr z<=^D0Y0~qr>k3PoFTAEGEN%9Hqw(ws_SAJS-m<~yS<~hwVT>Yy-dAA^-!-;KhO;A zNr%xAdI&v?j-q9B3@xYA=nPs(XVbZKK3zx`)1|bQo<+YxUtqi#IaA2!86z{9u`sR7 zOlCf_oLR%HV;*CkVGc8|F-MtW%n9Zs^Coked53wA`Hnfy{K#BjE-}9_zcN>uKUu_* ztUD`VN3lkhV|TCz*puvs>^Ba`fpnl9SO-T3X9rgYk%PN~r-QeHuS1N3+#${(!6C^Z z#bJa)s>5i9bcalbEQcJ2yBuaYEOB_q;VFlG4yPTybp(!LN2z0q<8a3jj;W5>j^iBb z9a|hb9I@j)jiAj-NSx;rNx~4~{=MUUdA~ z@v>96(@3WZr}0j;PIXQVPLrLm(>+f2I?ZvK=d{3Sk<${Vhn?0rbvkWu>UP@XwApE^ z(-TfFI3032>vYN4%{j(-gmbm?1n0@l7Ux#ysm^WA?ap(Y=Q%HMUgW&Qd71Na=O>&G zJD+#{-9_RO?ULk@;gac6(b&f%VoJsx66K)11<+$dR$(0IpXrWEA8s!>f$=c z)y*}~b(m|6tK2otHNiE{wZOH))#5tM^#Rw7u8+Dt=DNjor|Z+MdtG01J?;9j>nE<~ zTt6RFIjDBfltJx-?i;jb(7{2k4Z0)>6~%~>M46&2QI052R4%F#jTcQ28AKCBlSH#c zt3+Ex2Sp!?J`tT0eJ=Xa4Z1nHxw#E?OLHr9D|Rb&D|f4K)3{A^o8)G4o9t$BYjvCH zHp^|c+g!K#ZmZl@yRC71$ZfORR<|eIw!1y&_LAG{ZpYo;a69Gpt=so*Ke+wmcG2y3 zci@iPNp~0bB=?c-6WmSiE8W+)zvRB({h0e3?x);OyT9Z9o(J+6EYuc_VD)@ z>Jj51_lWaI@EGYa$|KDq!$axO;xW%-y~k#c$33=r?C{v@an$3O#|e*<9&dV__IStR zJ&&(EzVZ0ZAB7GInQ05yFK@MzUX<_ z^EJ<-p2s{-c%Jn9&dbv))GOah~)XVy@!neRChv*fle|sdbG`5Pe%O1Rcc=FT?{4pH z-aEW^dOz*`toQTY`@P@wKIi?t_isL=5ADPHIQlsIc=`DFh<*Hh2Kxm0r235U>F`uhn;!?*iWkeAoCs?zTf%&3(bcw)q|Nd*AO%zpwqi_50rM2fv^EF8V`%!k_YI{2lzA{9XJ9`A7IC_~-af@L%b_ z%m0x7tNus)kNKbQKk0wY|409e{y+O)@&C>L_W&xuJwP1bA22u|C?FzWXh39uG$1-4 zCLk#wJ)kN;AJ7zVSHPqIQ^4eanE`hP;DCDqmIf>jxIf^5fCmHC20Rw9Ibch`;{m$@ zjs_eHI1z9%;LU*30q+F77jP!v!+;+HE(BZ(_$A;rvlFeejfN`;8%e^1(88cL7qW_gHnRhg2n|+4w@b`BWQNegF)+qo(_63=xEUU zK_3Kt6m&M|)1c3Sz6km%=yK4nL05zR2nN9@m<*15NpVkkZB>)LuQ1`4Bmg@CE{1x94hbC*S{d3LIxBQh=;F|&p{ql?Lmv;_8M-@kPw2kT zp3uXguZ5lpeKYiQ=trR+hkg=zKJ=&1i=n@S{u+8Uj0$rO8x-aq<`w1>79KV%EGkSE zrU*+2OAZ?zRurZQs}E}myDO|YY;u@2Y-(6r*xayXVGoCOg>4LbG;C|wwy-C|o(ek@ zJ~X^2d`!4LyeWKQxG{WkxHbIl@O#2%htCUN5WYBkY511#J>l<${~!@b#FA)9g#S4R^*(>`H>4F zUy1xN$}cK2sx(R!rHQJJ8W&X)H8E;Zlqt#_bvWv+s1Kt)j`}3(T-4`L=c9g#x)k+G z)Rm~;q@>hU>Mw1UnxtlFt8|*QT{=_BN$-`;l`fDjmM)X7kgk$GD1At}PTD2ymOduk zD%~c1Qu?&?Iq3`1z0#MY2c(CjuS$W5 z=8>4KF;B#7kJ%aP7ds?&SZq{mbnNQb?$}MSn`0lB`^dxP5%Qt(DEV^vI(esjgZxp2 zi^5M4pa@iiC>APKE7m9;Qml(}it~;0iwlSgid!7FChnoQN8&o;UE=-X1L6bYL*nPf zuZ({n{=xW%5*!nJ62uAq34sZ76Yft~m9RQtZ6cfKmFSZwP7FxACvj=weTgd)S0(M$8^DZ^Y%1 z)JSHe!${|m(?-r7Id|mzk&8xNN=2z;DxK<(+L5{-by4b))caDej&c~~G|FX^Xw==K z7L8gmYT2k2qkbRlINEu%>u9&pGe*xJy>Rs6(aT0(Nu$%)G{-cTw5e(LrY%idp0+Y= zb=umrN76Q@J)X8L?a8#K(wbr4jDcfqcd_d$}_4nCS**`ux3onn4Zy*fio6nEXi1w zu_9w-#_EhU8P8;#$oM6b%9Ld$W~OBpWmaX5&8*4PWj16sW|}iwGpA-w&zzBYcP5v) zAoGFD&dhC@yE6A=zL@!P=E2OvnWr*OXTFp9e&z?6A7_4&`Az0!B~lJj`Y8u1gOy>* z2<0$kyfR6dq8zClrA$|5DhrhwWvz0Oa+Eqd`P)Y*{R&4 zd|UZPmUC8oR%%vWmL^M=)sWSgbywD;td^|yteII{)~u}AS@W_MWOZj9&3Z5EQug5N zi0qi`k=Z%f`PoI;rP-=%O|~w(A$vl$A$wxBF}o$ZEqhk>qU;B=H)e0j-je-9_KxhQ zviD{0&pwcSDEn~sk?hyAzswfZ!?~~Jp340&_lw+%xqs%NJSvaPbINng6Xylw1?Gk1h2=%$4b98UtI3<4w<2$M z-Ya=0^FGM?I`2~6FL_t;e#`qk@6UY4e3$$|`R@6i`9AsL{Lp+^ep0?Nza+mrU!7l- zKQ_N6-;m#&Z_J;ZZ^@sMKP`Vn{6MwUuT z6G}&y=9E^HYD?=%^`%Xv6HASyZKX3xXO?oMvr6Zb&MVzey07%J(hFt&W#MJ9Wy8yI z%F4^sWmRQk%WBGWWzA)#vdLxEvMFV4W$k76mMtlJploB=_OhL2&y+o1w!3U!*{fwo z%Z``5QFf~AblE#)7s~z0hn8oSPb{~VbLET5mzFOtUs=Aod~Nxo<(td5mTxQHQT|l< zGv)irkCeYv{z>_F9KPssI&41zq7#;aoAO!mna*MNma(MR>)KieVMX3T?%liu)_}R2-~$qvHLFFDouo z{9JLR;%dd8YNU2ii`4FFFSU=_PaU9^s1@pw>O6IYx>7wxJzia_u2&n?lhqdW6!kQ9 zyShU?M}41qt@<(bQ|f2cyVQHsFREWwzpg%^KB<07{kHl&^%?bN>L1ltH4Yk2jgQ7p zGguR>3DZPto67Gif2_P%`AZe5qN>;`$10a9QI&g@ ztg51_uBxM|yJ}n2^Hncb9k2SZ>TK1ysxPX(uKKR(hpG$JsG6!~tDUM{tKF(St9`1) z)e+T0t0Svr)r+gwR6kVxNOfoR)iDlZoW{6}5six)mppFxxRK*VkJ~ry$hg=etV5$jZaN*O;}At&9EA2O+rm_&4`-RnzWjXn(;OF z)-11iq2@r%k(zgE&eoi(`J(3Qn(u0UuDMckwdM~k)Dl`}t(P`X8>NlcCTWLjQ?+T@ zJZ+)2L|dk<&}y_=ZIgDgcBXc&c7b-WcA0jC_95*$ZI^bVc9V9qcBgi~_L%m4?K$li z+OM_WX@AgO(O%X5Sqp2)TDo>nt#55`t*kb&Hl=oC?daN!+Jf5R+Ok?zt){lBR#$7R zomM-$c1i7hwfEOPP`jpfL+zurn`^h$ZmZon7-$bgjCnx;EVm-RHUsx=XrWbidX$)>-S?>Som4U3YKY+`0vIi|UrwJy_ROx3%v1 qy1jKT)g7oiTz91ISlx-bck8~X`=RbtpUH*TBnanu= diff --git a/learn/go/interfaces.go b/learn/go/interfaces.go index 304af7a..5ef29ed 100644 --- a/learn/go/interfaces.go +++ b/learn/go/interfaces.go @@ -35,7 +35,7 @@ func (r *Round) Area() float64 { type Rectangular struct { - width float64 + width float64 height float64 } -- 2.47.0