結構體struct類似python語言中的類class,結構體類的元素可以是一個變數,或者函數或者其它的類型,好比python的屬性和方法。
// struct結構體,類似python語言中的class類package mainimport "fmt"type person struct { //定義一個strcut Name string Age int}func main() { a := person{} //賦值給一個變數a fmt.Println(a) a.Name = "faily" //為結構體賦值 a.Age = 28 fmt.Println(a)}/*輸出結果 { 0} //空結構體時,int元素為0{faily 28}*/
簡單的方式進行結構體的初始化
package mainimport "fmt"type person struct { //定義一個strcut Name string Age int}func main() { a := person{ //也可以這樣初始化一個結構體 Name: "msy", Age: 27, } fmt.Println(a)}
struct也是一個實值型別,也就是說傳遞的時候,拷貝的是值,正常途徑無法改變結構內的值,需通過指標的方式進行修改
package mainimport "fmt"type person struct { //定義一個strcut Name string Age int}func main() { a := person{ //初始化結構體 Name: "msy", Age: 27, } fmt.Println("1", a) A(a) fmt.Println("3", a) B(&a) //指標引用 fmt.Println("4", a)}func A(per person) { // 參數引用person--結構體 per.Age = 13 //初始化person屬性的值 fmt.Println("2", per)}func B(per *person){ //傳遞指標 per.Age =13 fmt.Println("2",per)}/*輸出初始化: 1 {msy 27}修改A: 2 {msy 13}修改失敗: 3'{msy 27}修改B: 2 {msy 13}修改成功: 3"{msy 13} */
推薦結構體初始化時,使用結構體指標,修改的時候更加方便
package mainimport "fmt"type person struct { //定義一個strcut Name string Age int}func main() { a := &person{ //初始化結構體,建議使用結構的指標 Name: "msy", Age: 27, } a.Name = "MYF" //這種方式就可以直接修改結構體 fmt.Println("1", a) A(a) //此時就可以直接修改結構體 B(a) fmt.Println("3", a)}func A(per *person) { //傳遞指標 per.Age = 13 //初始化person屬性的值 fmt.Println("2", per)}func B(per *person) { //傳遞指標 per.Age = 100 fmt.Println("2", per)}/*輸出1 &{MYF 27}2 &{MYF 13}2 &{MYF 100}3 &{MYF 100}*/
匿名結構:沒有名字的結構
package mainimport "fmt"func main() { a := &struct { //指向結構體指標 Name string Age int }{ //直接初始化 Name: "moshaoying", Age: 27, } fmt。Println(a)}/*輸出&{moshaoying 27}*/
嵌套匿名結構體,初始化方式
package mainimport "fmt"type person struct { //嵌套匿名結構 Name string Age int Content struct { Phone int Addr string }}func main() { a := person{Name: "moshaoying", Age: 22} a.Content.Phone = 13636269334 //嵌套匿名結構體初始化方式 a.Content.Addr = "shanxi,xian" fmt.Println(a)}/*輸出{moshaoying 22 {13636269334 shanxi,xian}}*/
結構體比較: 命名是結構體的一部分,所以只有當結構體命名相同時才可以進行比較
package mainimport "fmt"type person struct { //嵌套匿名結構 Name string Age int}type person1 struct { Name string Age int}func main() { a := person{Name: "moshaoying", Age: 22} b := person1{Name: "moshaoying", Age: 22} c := person{Name: "moshaoying", Age: 22} d : = person{Name: "moshaoying", Age: 21} fmt.Println(a == b) fmt.Println(a == c) fmt.Println(a == d)}/*輸出報錯a=b invalid operation: a == b (mismatched types person and person1)a=c truea=d false*/
結構體沒有python類的繼承,但是結構體也會有類似的功能,結構體嵌套,達到繼承其它結構體的屬性
package mainimport "fmt"type human struct { Sex int}type person struct { //結構體繼承(嵌套) human Name string Age int}func main() { a := person{Name: "failymao", Age: 22, human: human{Sex: 250}} //第一種方式,注意原理 fmt.Println(a) //第二種方式 a.Name = "allen" a.Age = 29 a.Sex = 222 fmt.Println(a)}/*輸出報錯第一種方式: {{250} failymao 22}第二種方式: {{222} allen 29}*/