Go言語の構造体

Go言語では、配列は同じ型のデータを格納できますが、構造体では項目ごとに異なるデータ型を定義できます。

構造体は、同じ型または異なる型の一連のデータで構成されるデータ集合です。

構造体は1つのレコードを表します。例えば、図書館の書籍レコードを保存する場合、各書籍には次の属性があります:

  • Title :タイトル
  • Author :著者
  • Subject:科目
  • ID:書籍ID

構造体を定義する

構造体の定義には、type と struct 文を使用する必要があります。struct 文は新しいデータ型を定義し、構造体には1つ以上のメンバーがあります。type 文は構造体の名前を設定します。構造体の形式は次のとおりです:

type struct_variable_type struct {
   member definition
   member definition
   ...
   member definition
}

構造体型を定義すると、それを変数の宣言に使用できます。構文形式は次のとおりです:

variable_name := structure_variable_type {value1, value2...valuen}
或
variable_name := structure_variable_type { key1: value1, key2: value2..., keyn: valuen}

例は次のとおりです:

例

package main

import "fmt"

type Books struct {
   title string
   author string
   subject string
   book_id int
}


func main() {

    // 新しい構造体を作成する
    fmt.Println(Books{"Go言語", "www.example.com", "Go言語チュートリアル", 6495407})

    // key => value 形式も使用できます
    fmt.Println(Books{title: "Go言語", author: "www.example.com", subject: "Go言語チュートリアル", book_id: 6495407})

    // 省略されたフィールドは 0 または空です
   fmt.Println(Books{title: "Go言語", author: "www.example.com"})
}

出力結果は次のとおりです:

{Go 语言 www.example.com Go 语言教程 6495407}
{Go 语言 www.example.com Go 语言教程 6495407}
{Go 语言 www.example.com  0}

構造体メンバーにアクセスする

構造体メンバーにアクセスするには、ドットが必要です.演算子。形式は次のとおりです:

構造体.メンバー名

構造体型の変数は struct キーワードを使用して定義します。例は次のとおりです:

例

package main

import "fmt"

type Books struct {
   title string
   author string
   subject string
   book_id int
}

func main() {
   var Book1 Books        /* Book1 を Books 型として宣言 */
   var Book2 Books        /* Book2 を Books 型として宣言 */

   /* book 1 の説明 */
   Book1.title = "Go言語"
   Book1.author = "www.example.com"
   Book1.subject = "Go言語チュートリアル"
   Book1.book_id = 6495407

   /* book 2 の説明 */
   Book2.title = "Pythonチュートリアル"
   Book2.author = "www.example.com"
   Book2.subject = "Python言語チュートリアル"
   Book2.book_id = 6495700

   /* Book1 の情報を出力 */
   fmt.Printf( "Book 1 title : %s\n", Book1.title)
   fmt.Printf( "Book 1 author : %s\n", Book1.author)
   fmt.Printf( "Book 1 subject : %s\n", Book1.subject)
   fmt.Printf( "Book 1 book_id : %d\n", Book1.book_id)

   /* Book2 の情報を出力 */
   fmt.Printf( "Book 2 title : %s\n", Book2.title)
   fmt.Printf( "Book 2 author : %s\n", Book2.author)
   fmt.Printf( "Book 2 subject : %s\n", Book2.subject)
   fmt.Printf( "Book 2 book_id : %d\n", Book2.book_id)
}

上記の例を実行した結果は次のとおりです:

Book 1 title : Go 语言
Book 1 author : www.example.com
Book 1 subject : Go 语言教程
Book 1 book_id : 6495407
Book 2 title : Python 教程
Book 2 author : www.example.com
Book 2 subject : Python 语言教程
Book 2 book_id : 6495700

関数パラメータとしての構造体

他のデータ型と同様に、構造体型をパラメータとして関数に渡すことができます。そして、上記の例のように構造体変数にアクセスします:

例

package main

import "fmt"

type Books struct {
   title string
   author string
   subject string
   book_id int
}

func main() {
   var Book1 Books        /* Book1 を Books 型として宣言 */
   var Book2 Books        /* Book2 を Books 型として宣言 */

   /* book 1 の説明 */
   Book1.title = "Go言語"
   Book1.author = "www.example.com"
   Book1.subject = "Go言語チュートリアル"
   Book1.book_id = 6495407

   /* book 2 の説明 */
   Book2.title = "Pythonチュートリアル"
   Book2.author = "www.example.com"
   Book2.subject = "Python言語チュートリアル"
   Book2.book_id = 6495700

   /* Book1 の情報を出力 */
   printBook(Book1)

   /* Book2 の情報を出力 */
   printBook(Book2)
}

func printBook( book Books ) {
   fmt.Printf( "Book title : %s\n", book.title)
   fmt.Printf( "Book author : %s\n", book.author)
   fmt.Printf( "Book subject : %s\n", book.subject)
   fmt.Printf( "Book book_id : %d\n", book.book_id)
}

上記の例を実行した結果は次のとおりです:

Book title : Go 语言
Book author : www.example.com
Book subject : Go 语言教程
Book book_id : 6495407
Book title : Python 教程
Book author : www.example.com
Book subject : Python 语言教程
Book book_id : 6495700

構造体ポインタ

他のポインタ変数と同様に、構造体を指すポインタを定義できます。形式は次のとおりです:

var struct_pointer *Books

上記で定義したポインタ変数は、構造体変数のアドレスを格納できます。構造体変数のアドレスを確認するには、構造体変数の前に & 記号を置きます:

struct_pointer = &Book1

構造体ポインタを使用して構造体メンバーにアクセスするには、"." 演算子を使用します:

struct_pointer.title

次に、構造体ポインタを使用して上記の例を書き直しましょう。コードは次のとおりです:

例

package main

import "fmt"

type Books struct {
   title string
   author string
   subject string
   book_id int
}

func main() {
   var Book1 Books        /* Book1 を Books 型として宣言 */
   var Book2 Books        /* Book2 を Books 型として宣言 */

   /* book 1 の説明 */
   Book1.title = "Go言語"
   Book1.author = "www.example.com"
   Book1.subject = "Go言語チュートリアル"
   Book1.book_id = 6495407

   /* book 2 の説明 */
   Book2.title = "Pythonチュートリアル"
   Book2.author = "www.example.com"
   Book2.subject = "Python言語チュートリアル"
   Book2.book_id = 6495700

   /* Book1 の情報を出力 */
   printBook(&Book1)

   /* Book2 の情報を出力 */
   printBook(&Book2)
}
func printBook( book *Books ) {
   fmt.Printf( "Book title : %s\n", book.title)
   fmt.Printf( "Book author : %s\n", book.author)
   fmt.Printf( "Book subject : %s\n", book.subject)
   fmt.Printf( "Book book_id : %d\n", book.book_id)
}

上記の例を実行した結果は次のとおりです:

Book title : Go 语言
Book author : www.example.com
Book subject : Go 语言教程
Book book_id : 6495407
Book title : Python 教程
Book author : www.example.com
Book subject : Python 语言教程
Book book_id : 6495700
その他の拡張