<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Go語言中沒有像C#、Java一樣的Class,只有Struct這樣的結構體。Go語言使用type關鍵字來定義一個型別。
如下:
type User struct { Name string Age int32 Sex int16 AvatarUrl string }
初始化方法一:直接定義,通過變數名.成員名的方式賦值
//初始化方法1 var user1 User user1.Name = "BigOrange" user1.Age = 20 user1.Sex = 1 user1.AvatarUrl = "xxxxxxx" fmt.Println("User1:",user1)
初始化方法二:直接通過{}進行初始化,這點和C#不一樣,C#初始化的時候一般用new,例如 var user = new User{xxxxx,xxxxx,xxxx}
//初始化方法2 var user2 User = User{ Name:"BigBanana", Age:23, Sex:0, AvatarUrl:"yyyyyyyyyyy", } fmt.Println("User2:",user2) //初始化方法2簡化 user3 := User{ Name:"BigBanana", Age:23, Sex:0, AvatarUrl:"yyyyyyyyyyy", } fmt.Println("User3:",user3)
Struct的指標比較簡單,就是通過&獲取地址,此外還可以用new來返回一個物件的指標
方式一
var user4 *User = &User{ Name:"BigPeach", Age:22, Sex:1, AvatarUrl:"zzzzzzz", } fmt.Println("User4:",user4) fmt.Println("User4:",*user4)
方式二
user5 := new(User) user5.Name="BigGrape" user5.Age= 25 user5.Sex= 1 user5.AvatarUrl= "mmmmmmmmm" fmt.Println("User5:",user5) fmt.Println("User5:",*user5)
上面第二種方式可能會有些疑問,user5不是一個指標型別嗎?怎麼和上面的值型別一樣直接用【變數名.成員】 的方式進行賦值了呢? 不是應該 (*user5).Name 這樣嗎?沒有錯!
這是GO語言實現的一個語法糖,實際上GO語言會幫我轉換。
例如下面這樣的一段程式碼
package main import "fmt" type AddressDemo struct { addr1 int32 addr2 int32 addr3 int32 } func main(){ addr := new(AddressDemo) fmt.Println("add1地址:",&addr.addr1) fmt.Println("add2地址:",&addr.addr2) fmt.Println("add3地址:",&addr.addr3) }
結果:
add1地址: 0xc042060080
add2地址: 0xc042060084
add3地址: 0xc042060088
可以看出來,addr1、addr2、addr3都是int32,都是佔用了4個位元組,他們的地址分配都是連續的。
For example: 下面這個User包,就實現了一個NewUser的方法,他就是建構函式
package User type User struct { Name string Age int32 Sex int16 AvatarUrl string } func NewUser(name string , age int32,sex int16,avatarUrl string) *User{ user:=new(User) user.Name = name user.Age = age user.Sex = sex user.AvatarUrl = avatarUrl return user }
可以像下面這樣宣告:後兩個欄位沒有名字
type Class struct { Name string int string }
使用的時候,對於匿名的欄位,直接賦值就可以了
class1:=Class{ Name:"Class1", int:123, string:"sssssss", } fmt.Println("class1:",class1)
結構體的巢狀
type User struct { Name string Age int32 Sex int16 AvatarUrl string } type Class struct { Name string } type Student struct { User User Class Class }
使用:
func main() { stu:=new(User.Student) stu.Class = User.Class{ Name:"5-2", } stu.User = User.User { Name:"BigBanana", Sex:1, Age:12, AvatarUrl:"asdasdasd", } fmt.Println(stu) }
如果是匿名結構體巢狀
呢?修改一下Student
type Student struct { User User Class }
使用在對Class這個成員進行賦值的時候,可以發現,既可以使用
stu.Class = User.Class{ Name:"5-2", }
也可以使用Name直接賦值,順序就是現在當前的結構體找,找不到再從匿名結構體中查詢,正好找到Class裡面有Name
stu.Name = "5-2"
如果Class和User都是匿名結構巢狀,但是他們裡面都有Name,當我們使用stu.Name的時候,那他存取的是Class裡的Name還是User裡面的Name? 那麼豈不是衝突了? 如何處理衝突?
當我試圖給stu.Name賦值的時候,編譯器報錯了,內容如下,也就是它找不到應該給誰賦值。
這時候要解決這個衝突,必須指定是哪個匿名欄位裡面的Name
stu:=new(User.Student) stu.User.Name = "123123" stu.Class.Name = "5-2" stu.User = User.User { Name:"BigBanana", Sex:1, Age:12, AvatarUrl:"asdasdasd", }
和包一樣,小寫的欄位外部不可見,大寫的外部可見
tag是結構體的元資訊,可以在執行的時候通過反射的機制讀出來。
怎麼寫tag?
以`作為開頭和結尾,中間是key-value形式的字串,每一個鍵值對以,作為分隔。例如
type User struct { UserName string `json:"userName",db:"User_Name"` Age int32 `json:"age"` Sex int16 `json:"sex"` AvatarUrl string `json:"avatarUrl",db:"Avatar_Url"` }
使用並執行:
func main() { user := User.User { UserName:"BigBanana", Sex:1, Age:12, AvatarUrl:"asdasdasd", } fmt.Println(user) data,_:=json.Marshal(user) fmt.Println(string(data)) }
結果:
{"userName":"BigBanana","age":12,"sex":1,"avatarUrl":"asdasdasd"}
可以看到,如果打了這個tag,會顯示tag後面的標記名稱。
此外:如果欄位名稱是小寫,那麼json輸出的時候就不會有這個欄位被列印了。
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對it145.com的支援。如果你想了解更多相關內容請檢視下面相關連結
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45