Go語言學習5 結構體 方法

2021-09-01 23:27:59 字數 3121 閱讀 8613

結構體是使用者定義的型別,表示若干個欄位的集合。有時應該把資料整合在一起,而不是讓這些資料沒有聯絡。go 語言中沒有類的概念,結構體就像是類的一種簡化形式。

package main

import

("fmt"

)type employee struct

func

main()

//creating structure without using field names

emp2 := employee

fmt.

println

("employee 1"

, emp1)

fmt.

println

("employee 2"

, emp2)

fmt.

println

("emp2 age:"

, emp2.age)

emp2.age =

30 fmt.

println

("emp2 new age:"

, emp2.age)

}

當定義好的結構體並沒有被顯式地初始化時,該結構體的字段將預設賦為其型別的零值。

package main

import

("fmt"

)func

main()

fmt.

println

("employee 3"

, e***)

}

package main

import

("fmt"

)type employee struct

func

main()

fmt.

println

("first name:",(

*emp8)

.firstname)

fmt.

println

("age:"

, emp8.age)

}

go 語言允許我們在訪問結構體字段時省略*符號。

package main

import

("fmt"

)type person struct

func

main()

fmt.

println

(p) fmt.

println

(p.int

)}

字段可以只有型別,而沒有欄位名。這樣的字段稱為匿名字段。雖然匿名字段沒有名稱,但其實匿名欄位的名稱就預設為它的型別。

如果結構體a中巢狀了乙個結構體b,則可以通過a.b.x來訪問b中的變數x。但如果是結構體中巢狀的是匿名的結構體型別欄位呢?此時該匿名結構體裡的字段就稱為提公升字段,可以用外部結構體直接訪問。舉例:

package main

import

("fmt"

)type address struct

type person struct

func

main()

fmt.

println

("name:"

, p.name)

fmt.

println

("city:"

, p.city)

//city is promoted field

}

如果外部結構體和內部巢狀結構體都包含有相同的欄位名,訪問時外部結構體優先。

go 方法是作用在接收者上的乙個函式,接收者是某種型別的變數。因此方法是一種特殊型別的函式。

package main

import

("fmt"

)type employee struct

/* displaysalary() 方法將 employee 做為接收器型別

*/func

(e employee)

displaysalary()

func

main()

emp1.

displaysalary()

// 呼叫 employee 型別的 displaysalary() 方法

}

如果作用在外部結構體和內部巢狀結構體上的方法有相同的方法名,訪問時外部結構體優先,這就和重寫乙個道理,可以視外部結構體為子類。

為什麼我們需要方法?使用函式不可以嗎?

package main

import

("fmt"

)type employee struct

//使用值接收器的方法。

func

(e employee)

changename

(newname string

)//使用指標接收器的方法。

func

(e *employee)

changeage

(newage int

)func

main()

fmt.

printf

("employee name before change: %s"

, e.name)

e.changename

("michael andrew"

) fmt.

printf

("\nemployee name after change: %s"

, e.name)

fmt.

printf

("\n\nemployee age before change: %d"

, e.age)

e.changeage(51

) fmt.

printf

("\nemployee age after change: %d"

, e.age)

}

指標接收器適用範圍:

學習資料:

Go語言學習草稿 5 結構體

package main import encoding json fmt type myint int32 自定義乙個myint型別,實際是int32 type intalias int64 型別別名 func customtypetest 定義person結構體.結構體是值型別 type per...

go語言學習筆記 結構體

go語言中,結構體的宣告非常類似c語言,具體定義方法如下 初始化方法有三種 package main import fmt 定義乙個結構體型別 type student struct func main fmt.println s1 s1 2.部分成員初始化,未初始化的變數被賦值為0 s2 stud...

go語言學習12(結構體)

格式 type 結構體名稱 struct 結構體如果需要匯出到其他包用,則名字首字母需要大寫 結構體中成員如果需要在其他包中引用,也需要首字母大寫。例如 type teststruct struct 上面結構體名 teststruct 可以被其他包引用 同理其成員 fieldout 也可以被其他包引...