Search…
構造体
構造体(struct)は、さまざまなデータ型(レコード)を組み合わせて宣言します。構造体は、さまざまな変数のリストをメモリの1つのブロックの中でひとつの名前で物理的にグループ化することで、単一のポインタでさまざまな変数にアクセスしたり、同じアドレスを返す名前で宣言された構造体にアクセスしたりできます。
オブジェクト指向プログラミング方面から来た方であればclassと見なすこともできなくはありませんが、構造体はより制約が多くなっています。
1
struct User {
2
name string
3
email string
4
country string
5
}
6
7
fn main() {
8
user := User {
9
name: "V developers"
10
11
country: "Canada"
12
}
13
14
println(user.country)
15
}
Copied!
注意: 構造体は(ヒープではなく)スタックに配置されます。
構造体のインスタンスを新たに作成するときには、各フィールドをカンマ,で区切ることもできます。これはワンライナーでインスタンスを作成するときに便利です。
1
user := User { name: "V developers", email: "[email protected]", country: "Canada" }
Copied!

&プレフィックス

構造体はヒープに配置して参照することもできます。これを行うには、以下のように&プレフィックスを追加します。
1
user := &User{"V developers", "[email protected]", "Canada"}
2
println(user.name)
Copied!
変数userの型は&Userになり、Userへの参照となります。

アクセス指定子

構造体のフィールドはデフォルトで「private」(モジュールの外からアクセスできない)かつ「イミュータブル」です。これはpubmutアクセス指定子で変更できます。
1
struct User {
2
email string // privateかつイミュータブル(デフォルト)
3
}
Copied!
mut:を指定すると「privateかつミュータブル」にできます。
1
struct User {
2
email string
3
mut:
4
first_name string // privateかつミュータブル
5
last_name string // (1つのアクセス指定子で複数のフィールドをまとめて指定できる)
6
}
Copied!
pub:を指定すると「publicかつイミュータブル」(リードオンリー)にできます。
1
struct User {
2
email string
3
mut:
4
first_name string
5
last_name string
6
pub:
7
sin_number int // publicかつイミュータブル(リードオンリー)
8
}
Copied!
pub mut:を指定すると「public」かつ「親モジュールの中でのみミュータブル」になります。
1
struct User {
2
email string
3
mut:
4
first_name string
5
last_name string
6
pub:
7
sin_number int
8
pub mut:
9
phone int // publicだが親モジュールでのみミュータブル
10
}
Copied!
__global:を指定すると、親モジュールの中か外かを問わず「publicかつミュータブル」になります。
1
struct User {
2
email string
3
mut:
4
first_name string
5
last_name string
6
pub:
7
sin_number int
8
pub mut:
9
phone int
10
__global:
11
address_1 string // 親モジュールの中でも外でもpublicかつミュータブル
12
address_2 string // (利用を勧めたくないので'__'で始めている)
13
city string
14
country string
15
zip string
16
}
Copied!

命名のルール

  • structの名前は常に大文字で始めること。
  • 構造体の中の変数(フィールド)についてはSnake_Caseにする。
訳注: フィールドのスネークケース縛りは近々変更される可能性あり。

演習

  1. 1.
    Userの情報を保存して表示する構造体を作成しましょう。
  2. 2.
    xフィールドとyフィールドを持つPoint構造体を作成し、フィールドをそれぞれprivateとpublicにしましょう。
Last modified 2yr ago