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"})
}
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)
}
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)
}
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)
}
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その他の拡張