日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

go语言基础-----06-----匿名字段、同名字段

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 go语言基础-----06-----匿名字段、同名字段 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 匿名字段、同名字段

1 匿名字段的作用及其初始化

  • 1)go中的匿名字段就是只有類型,沒有名字。
  • 2)匿名字段的作用:因為go沒有封裝、繼承、多態的概念,但是go也是可以面向對象編程,因為有匿名字段。例如下面,Student通過匿名字段繼承了Persion的所有成員。

實際上學過C的都知道,就是一個簡單的結構體嵌套而已,只不過在go叫得高大尚了。

type Persion struct {name stringsex byteage int }// 普通變量的聲明有var關鍵字,結構體內部不需要var type Student struct {Persion // 匿名字段,只有類型,沒有名字。它繼承了Persion的所有成員id intaddr string }
  • 3)匿名字段的初始化
package mainimport "fmt"type Persion struct {name stringsex byteage int }// 普通變量的聲明有var關鍵字,結構體內部不需要var type Student struct {Persion // 匿名字段,只有類型,沒有名字。它繼承了Persion的所有成員id intaddr string }func main(){// 1. 順序初始化var s1 Student = Student{Persion{"hh", 'w',24}, 1, "sz"}fmt.Println("s1 = ", s1)// 2. 自動推導類型s2 := Student{Persion{"cc", 'w',24}, 2, "sz"}fmt.Printf("s2 = %+v\n", s2)// %+v表示顯示更詳細// 3. 指定成員初始化s3 := Student{id:1}fmt.Printf("s3 = %+v\n", s3)// 這里指定成員賦值時,每個值前面必須手動添加對應的字段名,否則報mixture of field:value and value initializerss4 := Student{Persion: Persion{name: "ll", sex: 'w'}, id: 1}//s4 := Student{Persion{"cc", 'w'}, 2}// err:mixture of field:value and value initializersfmt.Printf("s4 = %+v\n", s4)// 4. 使用成員操作來指定成員初始化var s5 Students5.Persion.name = "qq" // 此時寫成s5.name是一樣的s5.name = "mm"s5.age = 24s5.id = 1fmt.Printf("s5 = %+v\n", s5) }

結果:

2 同名字段

1)同名字段就是在匿名字段中有一個成員,而匿名字段外也有一個同樣名字的成員。

type Persion struct {name stringsex byteage int }// 普通變量的聲明有var關鍵字,結構體內部不需要var type Student struct {Persion // 匿名字段,只有類型,沒有名字。它繼承了Persion的所有成員id intaddr stringname string // 同名字段,因為Persion里面也有一個name。編譯器依照就近原則去操作,即本成員優先級高。 }
  • 2)當存在同名字段時,編譯器會按照就近原則去搜索。如果在本作用域找到,則直接使用,沒有則去繼承的結構體中找。
package mainimport "fmt"type Persion struct {name stringsex byteage int }// 普通變量的聲明有var關鍵字,結構體內部不需要var type Student struct {Persion // 匿名字段,只有類型,沒有名字。它繼承了Persion的所有成員id intaddr stringname string // 同名字段,因為Persion里面也有一個name。編譯器依照就近原則去操作,即本成員優先級高。 }func main(){var s1 Students1.name = "hh" // 操作的是Student的name,而不是Persion的names1.id = 1s1.addr = "sz"s1.Persion.name = "perName" // 需要顯示操作才行s1.Persion.age = 22s1.Persion.sex = 'w' // ascii碼值打印字符類型fmt.Printf("s1 = %+v\n", s1) }

3 非結構體類型匿名字段

  • 1)實際上非結構體類型匿名字段和第1點講到的匿名字段是一樣的,只不過這些類型不是結構體,一般是基本數據類型,例如int、short這些。
    這里只是為了讓大家加深印象。
package mainimport "fmt"type Persion struct {name stringsex byteage int }// 普通變量的聲明有var關鍵字,結構體內部不需要var type Student struct {Persion // 匿名字段,只有類型,沒有名字。它繼承了Persion的所有成員int// string // 不能有同類型的匿名字段,會報錯error: duplicate field stringstring // 同名字段,因為Persion里面也有一個name。編譯器依照就近原則去操作,即本成員優先級高。 }func main(){var s1 Students1 = Student{Persion{"h", 'w', 24}, 111, "hhh"}fmt.Println("s1 = ", s1) }

4 結構體指針匿名字段

  • 1)同理,結構體指針匿名字段和第1點講的一樣,這里只是讓大家加深印象,指定怎么用。
package mainimport "fmt"type Persion struct {name stringsex byteage int }// 普通變量的聲明有var關鍵字,結構體內部不需要var type Student struct {*Persion // 匿名字段,只有類型,沒有名字。它繼承了Persion的所有成員id intaddr string }func main(){// 1. 不使用new的方式s1 := Student{&Persion{"hh", 'w', 24}, 1, "sz"}fmt.Println(s1.name, s1.sex, s1.age, s1.id, s1.addr)// 2. 使用new的方式var s2 Students2.Persion = new(Persion)s2.name = "cc"s2.sex = 'w's2.age = 24s2.id= 1s2.addr = "sz"fmt.Println(s2.name, s2.sex, s2.age, s2.id, s2.addr) }

總結

以上是生活随笔為你收集整理的go语言基础-----06-----匿名字段、同名字段的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。