構造は、同じタイプまたは異なるタイプの一連のデータで構成されるデータコレクションです。
Go言語の配列は同じタイプのデータを格納できますが、構造では、さまざまなアイテムにさまざまなデータタイプを定義できます。
構造定義
構造体の定義では、typeおよびstructステートメントを使用する必要があります。
structステートメントは、構造内に1つ以上のメンバーを持つ新しいデータ型を定義します。
typeステートメントは、構造の名前を設定します。
構造の形式は次のとおりです。
type test struct {
member definition
member definition
...
member definition
}
構造タイプを定義すると、変数宣言に使用できるようになります。構文の形式は次のとおりです。
variable_name := test {
value1, value2...valuen}
或
variable_name := test {
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 语言", "zhangsan", "Go 语言教程", 34324})
// 也可以使用 key => value 格式
fmt.Println(Books{
title: "Go 语言", author: "zhangsan", subject: "Go 语言教程", book_id: 878756})
// 忽略的字段为 0 或 空
fmt.Println(Books{
title: "Go 语言", author: "zhangsan"})
}
アクセス構造メンバー
構造体のメンバーにアクセスする場合は、ドットを使用する必要があります。演算子の
形式は次のとおりです:
構造。メンバー名
構造型変数は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.runoob.com"
Book1.subject = "Go 语言教程"
Book1.book_id = 6495407
/* book 2 描述 */
Book2.title = "Python 教程"
Book2.author = "www.runoob.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)
}
これは、JAVAでの呼び出しと非常によく似ています。オブジェクトを定義した後、メンバー変数をカプセル化すると、メンバー変数を呼び出すことができます。
ただし、go言語はカプセル化のみをサポートし、JAVAとは異なり、継承とポリモーフィズムをサポートしていません。
実行結果は次のとおりです。
Book 1 title : Go 语言
Book 1 author : www.runoob.com
Book 1 subject : Go 语言教程
Book 1 book_id : 6495407
Book 2 title : Python 教程
Book 2 author : www.runoob.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.runoob.com"
Book1.subject = "Go 语言教程"
Book1.book_id = 6495407
/* book 2 描述 */
Book2.title = "Python 教程"
Book2.author = "www.runoob.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)
}
aを構造体アドレスとして直接取ることができ、そのようなaは通常の型操作とも互換性があるため、一般的な状況です
コードは以下のように表示されます:
package main
import "fmt"
type test struct{
Name string
Age int
}
func A(t* test){
t.Age = 15
}
func main(){
a:=&test{
Name:"john",
Age: 19,
}
A(a)
fmt.Println(a)
a.Age=20
fmt.Println(a)
}
構造ポインタ
構造体へのポインターの定義は、次の形式で他のポインター変数に似ています。
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
var Book2 Books
/* book 1 描述 */
Book1.title = "Go 语言"
Book1.author = "www.runoob.com"
Book1.subject = "Go 语言教程"
Book1.book_id = 6495407
/* book 2 描述 */
Book2.title = "Python 教程"
Book2.author = "www.runoob.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.runoob.com
Book subject : Go 语言教程
Book book_id : 6495407
Book title : Python 教程
Book author : www.runoob.com
Book subject : Python 语言教程
Book book_id : 6495700
匿名の構造
package main
import "fmt"
func main(){
a:=struct{
Name string
Age int
}
{
Name:"joe",
Age:19,
}
fmt.Println(a)
}
構造の入れ子
package main
import "fmt"
type human struct{
Sex int
}
type teacher struct{
human
Name string
Age int
}
type student struct{
human
Name string
Age int
}
func main(){
a:=student{
Name:"joe",Age:19,human:human{
Sex:0}};
b:=teacher{
Name:"joe",Age:20,human:human{
Sex:0}};
fmt.Println(a,b)
a.Sex=1
fmt.Println(a,b)
}