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