入門「Go言語仕様書輪読会」 2021/2/18 Thu
nobishii (@shino_nobishii)
はじめに
目次
要約: defined typeの定義
defined typeを知るとわかること(深入りしません)
事前宣言された型 (int, string…) | defined type |
defined type | |
型リテラルを用いて構成された合成型 | defined typeではない |
定義(再掲)
defined typeは、次の2種類の型である:
事前宣言された型とは
型リテラルとは: 次の8種類のリテラルであり、型を表す
[]int | SliceType |
[10]int | ArrayType |
*int | PointerType |
map[Key]Value | MapType |
interface {SomeMethod()} interface {} | InterfaceType |
struct {ID int} | StructType |
func(string) int | FunctionType |
chan int | ChannelType |
type NewType SomeType
宣言された新しい型
(このNewTypeはdefined type)
既知の型
string
map[string]string
struct {
ID int
Name string
}
SomeKnownType(※定義済とする)
Go言語の型3種類とdefined type
事前宣言された型 (int, string…) | defined type |
型定義により宣言された型 | defined type |
型リテラルを用いて構成された合成型 | defined typeではない |
定義(再掲)
defined typeは、次の2種類の型である:
Q. どれがdefined typeでしょうか?
package main
type S []int
type T int
定義(再掲)
defined typeは、次の2種類の型である:
A. どれがdefined typeでしょうか?
package main // S, T, intがdefined type
type S []int
type T int
定義(再掲)
defined typeは、次の2種類の型である:
展望: 値xと型Tの関係性とdefined type
深入りはしませんがちょっとだけdefined typeの役立つポイントをご紹介します
まとめ: defined typeの定義
Q & A
updated: 24th March 2021
Q. defined typeでないtypeはcomposite typeと呼べばいいんでしょうか?
A. ちょっと明確に答えられないところです。
composite typeという語は仕様書に現れるのですが明確に定義されていません。
[]string のような型リテラルがcomposite typeであることは確かなのですが、
type S []string のようにして定義したSがcomposite typeなのかどうかはっきりと言えないためです。
defined typeではない型に対する便利な名称は今のところ見当たりません。
Q. type alias で導入された名前は Defined Type じゃない、という理解でよいですか?
type aliasで導入された名前そのものは正確には「型に束縛された識別子」であって型ではありません。そういう意味ではYesです。
type aliasが束縛された型についていうと、defined typeである場合もあり、そうでない場合もあります。
Q. 代入可能集合の部分集合として型が同一とありますが、型が異なる場合で代入可能な例ってありますか?
はい、あります。
type S []string としたとき、Sと[]stringは異なる型ですが、
var s S
s = []string{}
のように代入可能です。
Q. すでに定義された型にtype definitionを使うメリットはなんですか?
1つは、それによって新たにメソッドを定義できるようになることです。
もう1つは、すでに定義されたdefined typeに対してtype definitionを使って新しいdefined typeを作ると、その2つの型はお互いに代入不可能になります:
var MyInt int // int型の値はMyInt型の変数に代入できない
これにより、underlying typeは等しいけれども意味が異なる値がある場合(郵便番号と名前、のような)、異なるdefined typeを割り当てることで代入のミスを事前に防ぐことができます。