🪁
空構造体 の表し方
はじめに結論
空の構造体(struct)はstruct{}
と表します
interface{}
みたいなものですね
空構造体は
- 空の構造体はメモリサイズが 0である
- 空の構造体は属性(フィールド) を持たない
- 空の構造体は同じアドレスを示す
などといった特性を持ちます.
まず,構造体(struct)とは?
「type [定義する名前] struct」
のように使用します
// 「Person」という名前の構造体(struct)
// この場合、NameとAgeという「フィールド」を持っています
type Person strcut {
Name string
Age int
}
「フィールド」はpytonなどで使われるclass
でいうところの,コンストラクタのようなものです
そして、このフィールドを何も持たない
,つまり”空”であるということから
struct{}
この書き方で表せるのですね〜!
使ってみた
package main
import "fmt"
type (
numbers struct{}
pointers struct{}
)
func (numbers) count() int {
return 10
}
func (p pointers) address() string {
return fmt.Sprintf("%p \n", &p)
}
func main() {
var (
numberFirst = numbers{}
p1 = pointers{}
p2 = pointers{}
p3 = pointers{}
)
// numberFirst から addr() は呼べない
// p1~3 から count() は呼べない
fmt.Println(numberFirst.count())
fmt.Println(p1.address(), p2.address(), p3.address())
}
// 出力
10
0x596c18
0x596c18
0x596c18
空構造体は
- 空の構造体はメモリサイズが 0である
- 空の構造体は属性を持たない
- 空の構造体は同じアドレスを示す
空構造体は,何度生成しても同じアドレス
を示すので,実体(numberFirst
, p1
, p2
, p3
)は同じものということになります
しかしながらGoでは,型の別名を付与すると完全に別の型として扱われるため,同じアドレスを示すものでも別名さえ付けてしまえば、上記のようにそれぞれに個別にメソッドが定義できます
また、メモリを使わない
ため,例えば,終了管理のみ行うチャネルを用意する際に
type nothing struct{}
done := make(chan nothing)
go func() {
defer close(done)
}()
などとすることができます
何かと使えそうですね.
Discussion