Go言語の構造


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

構造とは、同じタイプまたは異なるタイプの一連のデータで構成されるデータのコレクションです。

この構造は、図書館に書籍レコードを保存するなどのレコードを表します。各書籍には次の​​属性があります。 : 書籍 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}
  • 構造体のメンバーにアクセスする

  • 構造体にアクセスしたい場合。メンバーの場合は、ピリオド (.) 演算子を使用する必要があります。形式は「構造体.メンバー名」です。
  • 構造体型変数は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.php.cn"
       Book1.subject = "Go 语言教程"
       Book1.book_id = 6495407
    
       /* book 2 描述 */
       Book2.title = "Python 教程"
       Book2.author = "www.php.cn"
       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.php.cn
Book 1 subject : Go 语言教程
Book 1 book_id : 6495407
Book 2 title : Python 教程
Book 2 author : www.php.cn
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.php.cn"
   Book1.subject = "Go 语言教程"
   Book1.book_id = 6495407

   /* book 2 描述 */
   Book2.title = "Python 教程"
   Book2.author = "www.php.cn"
   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.php.cn
Book subject : Go 语言教程
Book book_id : 6495407
Book title : Python 教程
Book author : www.php.cn
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        /* Declare Book1 of type Book */
   var Book2 Books        /* Declare Book2 of type Book */

   /* book 1 描述 */
   Book1.title = "Go 语言"
   Book1.author = "www.php.cn"
   Book1.subject = "Go 语言教程"
   Book1.book_id = 6495407

   /* book 2 描述 */
   Book2.title = "Python 教程"
   Book2.author = "www.php.cn"
   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.php.cn
Book subject : Go 语言教程
Book book_id : 6495407
Book title : Python 教程
Book author : www.php.cn
Book subject : Python 语言教程
Book book_id : 6495700