version | example_title |
---|---|
1.0.0 |
構造体 |
構造体(struct)は、さまざまなデータ型(レコード)を組み合わせて宣言します。構造体は、さまざまな変数のリストをメモリの1つのブロックの中でひとつの名前で物理的にグループ化することで、単一のポインタでさまざまな変数にアクセスしたり、同じアドレスを返す名前で宣言された構造体にアクセスしたりできます。
オブジェクト指向プログラミング方面から来た方であればclass
と見なすこともできなくはありませんが、構造体はより制約が多くなっています。
struct User {
name string
email string
country string
}
fn main() {
user := User {
name: "V developers"
email: "[email protected]"
country: "Canada"
}
println(user.country)
}
注意: 構造体は(ヒープではなく)スタックに配置されます。
構造体のインスタンスを新たに作成するときには、各フィールドをカンマ,
で区切ることもできます。これはワンライナーでインスタンスを作成するときに便利です。
user := User { name: "V developers", email: "[email protected]", country: "Canada" }
構造体はヒープに配置して参照することもできます。これを行うには、以下のように&
プレフィックスを追加します。
user := &User{"V developers", "[email protected]", "Canada"}
println(user.name)
変数user
の型は&User
になり、User
への参照となります。
構造体のフィールドはデフォルトで「private」(モジュールの外からアクセスできない)かつ「イミュータブル」です。これはpub
やmut
アクセス指定子で変更できます。
struct User {
email string // privateかつイミュータブル(デフォルト)
}
mut:
を指定すると「privateかつミュータブル」にできます。
struct User {
email string
mut:
first_name string // privateかつミュータブル
last_name string // (1つのアクセス指定子で複数のフィールドをまとめて指定できる)
}
pub:
を指定すると「publicかつイミュータブル」(リードオンリー)にできます。
struct User {
email string
mut:
first_name string
last_name string
pub:
sin_number int // publicかつイミュータブル(リードオンリー)
}
pub mut:
を指定すると「public」かつ「親モジュールの中でのみミュータブル」になります。
struct User {
email string
mut:
first_name string
last_name string
pub:
sin_number int
pub mut:
phone int // publicだが親モジュールでのみミュータブル
}
__global:
を指定すると、親モジュールの中か外かを問わず「publicかつミュータブル」になります。
struct User {
email string
mut:
first_name string
last_name string
pub:
sin_number int
pub mut:
phone int
__global:
address_1 string // 親モジュールの中でも外でもpublicかつミュータブル
address_2 string // (利用を勧めたくないので'__'で始めている)
city string
country string
zip string
}
struct
の名前は常に大文字で始めること。- 構造体の中の変数(フィールド)については
Snake_Case
にする。
訳注: フィールドのスネークケース縛りは近々変更される可能性あり。
User
の情報を保存して表示する構造体を作成しましょう。x
フィールドとy
フィールドを持つPoint
構造体を作成し、フィールドをそれぞれprivateとpublicにしましょう。