Go語言提供了和C語言概念一致的結構體,陣列存的元素都是同一種資料型別,而結構體中可以存盤不同型別的資料,結構體和指標是為什么稱Go語言是類C語言的重要原因,因為兩者在這兩個概念上是完全一致的,
結構體是由一系列相同型別或者不同型別的資料構成的資料集合,
在概念上,結構體表示某一事物的屬性集合,比如一首歌可以使用以下屬性描述:
- titile: 夕焼けのスターマイン
- singer: 今井麻美
- duration: 4.35
結構體使用關鍵字struct宣告,其定義語法如下:
type struct_variable_type struct {
member1 variable_type1
member2 variable_type2
...
membern variable_typen
}
其中struct_varibale_type可以自定義,member1也可以自定義,本質上是一個字串,可以使用中文或者其他語言,只不過使用英文是潛規則,variable_type是基本資料型別,完全等同于C語言,
結構體變數以如下語法宣告:
varibale_name := structure_varibale_type {value1, value2, ..., valuen}
variable_name := structure_varibale_type {key1: value1, key2: value2, ..., keyn: valuen}
實體:
package main
import "fmt"
type Song struct {
title string // 歌名 string
singer string // 歌手 string
duration float32 // 時長 float32
}
func main() {
song1 := Song{"夕焼けのスターマイン", "今井麻美", 4.35}
fmt.Println(song1)
// 可以創建匿名結構體
fmt.Println(Song{"潮汐", "雙笙/泠鳶", 4.53})
fmt.Println(Song{"Angel of the Moring", "Juice Newton", 4.01})
}
// 輸出是自帶花括號的
// {夕焼けのスターマイン 今井麻美 4.35}
// {潮汐 雙笙/泠鳶 4.53}
// {Angel of the Moring Juice Newton 4.01}
結構體可以嵌套定義,比如概念上一張專輯由幾首歌組成,實體如下:
package main
import "fmt"
type Song struct {
title string
singer string
duration float32
}
type Album struct {
song1 Song
song2 Song
song3 Song
}
func main() {
song1 := Song{"夕焼けのスターマイン", "今井麻美", 4.35}
song2 := Song{"潮汐", "雙笙/泠鳶", 4.53}
song3 := Song{"Angel of the Moring", "Juice Newton", 4.01}
album := Album{song1, song2, song3}
fmt.Println(album)
}
// {{夕焼けのスターマイン 今井麻美 4.35} {潮汐 雙笙/泠鳶 4.53} {Angel of the Moring Juice Newton 4.01}}
訪問結構體成員
結構體成員使用.運算子訪問,.運算子在編程語言中的通用概念即為訪問一個集合中的某一個元素,
package main
import "fmt"
type Song struct {
title string
singer string
duration float32
}
type Album struct {
song1 Song
song2 Song
song3 Song
}
func main() {
song1 := Song{"夕焼けのスターマイン", "今井麻美", 4.35}
song2 := Song{"潮汐", "雙笙/泠鳶", 4.53}
song3 := Song{"Angel of the Moring", "Juice Newton", 4.01}
album := Album{song1, song2, song3}
fmt.Println(album.song1)
}
// {夕焼けのスターマイン 今井麻美 4.35}
結構體指標
Go語言中也可以定義結構體指標,即指向結構體的指標,語法如下:
var struct_pointer *Song
struct_pointer = &song1
結構體作為函式引數
Go語言中結構體也可以作為函式引數傳遞,結構體指標也可以,那么傳結構體和傳結構體指標有什么區別呢?
實體(傳結構體):
package main
import "fmt"
type Song struct {
title string
singer string
duration float32
}
func cover(song Song, newSinger string) {
song.singer = newSinger
}
func main() {
song := Song{"潮汐", "雙笙/泠鳶", 4.53}
cover(song, "Hirro")
fmt.Println(song)
}
// {潮汐 雙笙/泠鳶 4.53}
你可以看到歌曲的歌手并沒有改成新的翻唱歌手,
實體(傳結構體指標):
package main
import "fmt"
type Song struct {
title string
singer string
duration float32
}
func cover(song *Song, newSinger string) {
song.singer = newSinger
}
func main() {
song := Song{"潮汐", "雙笙/泠鳶", 4.53}
cover(&song, "Hirro")
fmt.Println(song)
}
// {潮汐 Hirro 4.53}
歌曲的歌手成功改成了新的翻唱歌手,
這就是傳結構體和傳指標的區別,傳結構體是值傳遞,相當于復制了一份送到函式中,函式修改的只是副本,不是原來的結構體變數;傳結構體指標是參考傳遞,傳進去的結構體變數的地址,對改地址指向的內容修改會直接作用到該構體變數,
當然,你可以通過函式回傳值覆寫原值來是現更改,但這樣做很麻煩,包含了復制、回傳值、重新賦值等一系列操作,計算復雜度高了很多,
package main
import "fmt"
type Song struct {
title string
singer string
duration float32
}
func cover(song Song, newSinger string) Song {
song.singer = newSinger
return song
}
func main() {
song := Song{"潮汐", "雙笙/泠鳶", 4.53}
song = cover(song, "Hirro")
fmt.Println(song)
}
// {潮汐 Hirro 4.53}
這個例子體現了指標的靈活性,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/237969.html
標籤:區塊鏈
上一篇:第14章內容總結
