Upgrade to Pro — share decks privately, control downloads, hide ads and more …

go言語について私が知っている二、三の事柄

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for SATO taichi SATO taichi
December 07, 2013

 go言語について私が知っている二、三の事柄

Avatar for SATO taichi

SATO taichi

December 07, 2013
Tweet

Other Decks in Technology

Transcript

  1. deferした関数内でrecoverを呼ぶ p a c k a g e m a

    i n i m p o r t " f m t " f u n c m a i n ( ) { d e f e r f u n c ( ) { f m t . P r i n t l n ( r e c o v e r ( ) ) / / p a n i c の引数である" E N D " がr e c o v e r で取れる } ( ) f m t . P r i n t l n ( " B E G I N " ) p a n i c ( " E N D " ) / / ここでl o n g j m p 的なアレ f m t . P r i n t l n ( " A f t e r p a n i c " ) / / ここは動かない }
  2. とcatch句の様に見えなくもない errorをtype switchする t y p e H o g

    e E r r o r s t r u c t { } f u n c ( e H o g e E r r o r ) E r r o r ( ) s t r i n g { r e t u r n " H O G E " } t y p e F u g a E r r o r s t r u c t { } f u n c ( e F u g a E r r o r ) E r r o r ( ) s t r i n g { r e t u r n " F U G A " } f u n c m a i n ( ) { e r r : = p i r o ( ) s w i t c h i : = e r r . ( t y p e ) { c a s e n i l : f m t . P r i n t l n ( " e r r o r i s n i l " ) c a s e H o g e E r r o r : f m t . P r i n t f ( " H H H % s \ n " , i ) c a s e F u g a E r r o r : f m t . P r i n t f ( " F F F % s \ n " , i ) d e f a u l t : p a n i c ( " p p p a a a a n n n i i i i c c c c c c ! ! " ) } }
  3. go言語では関数が多値を返せるのであるからerrorを使うべき p a c k a g e m a

    i n i m p o r t " f m t " f u n c m a i n ( ) { i f l i n e , e r r : = R e a d ( ) ; e r r = = n i l { f m t . P r i n t l n ( l i n e ) } e l s e { p a n i c ( e r r ) } } f u n c R e a d ( ) ( s t r i n g , e r r o r ) { }
  4. nil

  5. ちなみに、代入されたnilを返そうとすると不思議な事がおこる p a c k a g e m a

    i n i m p o r t " f m t " t y p e M y E r r o r s t r u c t { } f u n c ( e M y E r r o r ) E r r o r ( ) s t r i n g { r e t u r n " O H " } f u n c m a i n ( ) { f m t . P r i n t l n ( a a a ( ) = = n i l ) } / / f a l s e ! ! ! f u n c a a a ( ) e r r o r { v a r e r r * M y E r r o r = n i l i f b b b ( ) { e r r = & M y E r r o r { } } r e t u r n e r r } f u n c b b b ( ) b o o l { r e t u r n f a l s e } bbb関数でfalseを返しているので、 aaa関数の戻り値はnilになりそうだが a a a ( ) = = n i l はfalseになる。
  6. nilなポインタ経由で メソッドを呼び出してもクラッシュしないオブジェクト p a c k a g e m

    a i n i m p o r t " f m t " t y p e N u l l N u l l s t r u c t { N a m e s t r i n g } f u n c ( n n * N u l l N u l l ) G e t s ( ) s t r i n g { i f n n = = n i l { r e t u r n " W e a r e N u l l O b j e c t ! ! " } r e t u r n n n . N a m e } f u n c m a i n ( ) { v a r n n * N u l l N u l l = n i l f m t . P r i n t l n ( n n . G e t s ( ) ) n n = & N u l l N u l l { N a m e : " J o h n " } f m t . P r i n t l n ( n n . G e t s ( ) ) }
  7. interfaceに対してのみ が利用できる Type Assertionsという構文 p a c k a g

    e m a i n i m p o r t " f m t " t y p e A t t a c k e r i n t e r f a c e { A t t a c k ( ) } t y p e D e f e n d e r i n t e r f a c e { D e f e n c e ( ) } t y p e M i d f i e l d e r s t r u c t { } f u n c ( f * M i d f i e l d e r ) A t t a c k ( ) { } f u n c ( f * M i d f i e l d e r ) D e f e n c e ( ) { } f u n c m a i n ( ) { v a r d D e f e n d e r = & M i d f i e l d e r { } i f _ , o k : = d . ( A t t a c k e r ) ; o k { f m t . P r i n t l n ( " M i d p l a y s A t t a c k r o l e " ) } e l s e { f m t . P r i n t l n ( " M i d d o e s n ' t p l a y a t t a c k r o l e " ) } }
  8. ところで、interface型(i n t e r f a c e {

    } )は、 JavaにおけるObject型の様にあらゆる型に適合する。 v a r d i n t e r f a c e { } = & M i d f i e l d e r { } i f _ , o k : = d . ( A t t a c k e r ) ; o k { f m t . P r i n t l n ( " M i d p l a y s A t t a c k r o l e " ) }
  9. これはコンパイルエラー v a r d * M i d f

    i e l d e r = & M i d f i e l d e r { } i f _ , o k : = d . ( A t t a c k e r ) ; o k { f m t . P r i n t l n ( " M i d p l a y s A t t a c k r o l e " ) }