Slide 1

Slide 1 text

入門Go言語仕様輪読会 “Underlying Type” @DQNEO 2021-02-18 20:10

Slide 2

Slide 2 text

自己紹介 ● @DQNEO (ドキュネオ) ● Goコンパイラ babygo の作者です ○ https://github.com/DQNEO/babygo ● 公式Goコンパイラ コントリビュート歴有り ● Go言語仕様書 コントリビュート歴有り(←New)

Slide 3

Slide 3 text

全ての型には “Underlying Type” がある

Slide 4

Slide 4 text

underlyingの意味 lying or situated under something --- Oxford’s Languages

Slide 5

Slide 5 text

underlying type = 背後霊 私 霊

Slide 6

Slide 6 text

“Underlying Type”がなぜ重要なのか ● Assignability (代入可能性) の条件に使われている ● Generics で重要な役割をになう ○ 設計ドラフトで “underlying type” が11回登場 https://go.googlesource.com/proposal/+/refs/heads/ master/design/go2draft-type-parameters.md

Slide 7

Slide 7 text

例 type MyInt int MyInt の underlying type は int

Slide 8

Slide 8 text

イメージ 背後霊 MyInt int type MyInt int

Slide 9

Slide 9 text

全ての型には “Underlying Type” がある = 全ての型には 背後霊型がある

Slide 10

Slide 10 text

MyInt int では int の underlying type は? type MyInt int ?

Slide 11

Slide 11 text

int int int の underlying type は int

Slide 12

Slide 12 text

ルール1: predeclared な boolean, numeric, string の underlyng type は 自分自身 ルール2: 型リテラルの underlyng type は自分自身 ルール3: 型定義すると、左側と右側で underlyng type を共有する 3つのルール

Slide 13

Slide 13 text

predeclaredな boolean,string,numeric のunderlying typeは自分自身 ルール1 ● bool ● string ● int int8 int16 int32 int64 uint uint8 uint16 uint32 uint64 uintptr complex64 complex128 float32 float64

Slide 14

Slide 14 text

複合的な型 type User struct { id int name string } User struct { id int name string } 背後霊

Slide 15

Slide 15 text

struct{...}の underlying type は? struct { id int name string }

Slide 16

Slide 16 text

struct { id int name string } struct { id int name string } struct{...}の underlying typeは自分自身

Slide 17

Slide 17 text

型リテラルの underlying typeは 自分自身 ルール2 例: *int struct{...} []string map[int]bool interface{...} ※前半発表のNobishiiさん の資料もご参照ください。

Slide 18

Slide 18 text

type MyInt int MyInt int 派生型から派生させると? type MyMyInt MyInt MyMyInt 誰?

Slide 19

Slide 19 text

int type MyInt int MyInt int 派生型から派生させると? type MyMyInt MyInt MyMyInt えっ?

Slide 20

Slide 20 text

型定義をすると、 左側と右側が underlying typeを共有する ルール3 type B A 左 右 ※前半発表のNobishiiさんの資料も ご参照ください

Slide 21

Slide 21 text

背後霊を共有する type B A B A Aの背後霊

Slide 22

Slide 22 text

type MyInt int MyInt int int 背後霊を共有する

Slide 23

Slide 23 text

type MyMyInt MyInt MyMyInt MyInt int 背後霊を共有する

Slide 24

Slide 24 text

type User struct{ id… } User struct{id...} struct{id...} 背後霊を共有する

Slide 25

Slide 25 text

type AdminUser User AdminUser User struct{id...} 背後霊を共有する

Slide 26

Slide 26 text

type MyInt int type MyMyInt MyInt type MyMyMyInt MyMyInt MyInt int int フラットな組織 MyMyInt MyMyMyInt

Slide 27

Slide 27 text

func (x MyInt) method() { } MyInt int int Method の継承 MyMyInt MyMyMyInt method なし method なし method なし method あり method なし

Slide 28

Slide 28 text

Method の継承 A defined type may have methods associated with it. It does not inherit any methods bound to the given type, but the method set of an interface type or of elements of a composite type remains unchanged: ● interface型 : 継承される ● 構造体型の要素のメソッド: 継承される ● それ以外の型: 継承されない

Slide 29

Slide 29 text

型のヒエラルキー (段階的階層)がない

Slide 30

Slide 30 text

Go言語誕生の背景 https://talks.golang.org/2009/go_talk-20091030.pdf

Slide 31

Slide 31 text

https://talks.golang.org/2009/go_talk-20091030.pdf Go言語の設計原則

Slide 32

Slide 32 text

ルール1: predeclared boolean, numeric, string の underlyng type は自分自身 ルール2: 型リテラルの underlyng type は自分自身 ルール3: 型定義すると、左側と右側で underlyng type を共有する まとめ

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

クイズ1 type ( B1 string B2 B1 ) string, B1, B2 の それぞれの underlying type は? → 答えは言語仕様書に

Slide 35

Slide 35 text

クイズ2 type ( B1 string B2 B1 B3 []B1 B4 B3 ) [ ]B1, B3, B4 のそれぞれの underlying type は? → 答えは言語仕様書に

Slide 36

Slide 36 text

ご清聴 ありがとうございました