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

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

SATO taichi
December 07, 2013

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

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 " ) }