Go 透過型別別名(alias types)和結構體的形式支援使用者自訂類型。
結構體是複合類型,當需要定義類型,它由一系列屬性組成,每個屬性都有自己的類型和值的時候,就應該使用結構體,它把資料聚集在一起。
結構體也是值類型,因此可以透過 new 函數來建立
組成結構體類型的那些資料成為欄位(fields)。每個欄位都有一個類型和一個名字;在一個結構體中,欄位名字必須是唯一的。
一,結構體定義
結構體定義的一般方式如下:
type identifier struct { field type1 field type2}
type T struct {a, b int} 也是合法的語法,它更適用於簡單的結構體
結構體裡的字段都有名字,像field1、field2 等,如果字段在代碼中從來也不會被用到,那麼可以命名它為_。
結構體類型和欄位的命名遵循可見性規則,所以可能存在一個結構體類型的某些欄位是導出的,而有些則沒有導出。
結構體的欄位可以是任何類型,甚至是結構體本身,也可以是函數或介面。可以宣告結構體類型的一個變量,然後像下面這樣給它的字段賦值:
var s T s.a = 5 s.b = 8
數組也可以看作是一種結構體類型,不過它使用下標而不是具名的字段
二,初始化
方式一:透過var 宣告結構體
在Go 語言中當一個變數被宣告的時候,系統會自動初始化它的預設值,例如int 被初始化為0,指標為nil。
var 宣告同樣也會為結構體類型的資料分配內存,所以我們才能像上一段程式碼中那樣,在宣告了 var s T 之後就能直接給他的欄位進行賦值
#方式二:使用new
使用new 函數給一個新的結構體變數分配內存,它會傳回指向已分配記憶體的指標:var t *T = new(T)。
type struct1 struct { i1 int f1 float32 str string}func main() { ms := new(struct1) ms.i1 = 10 ms.f1 = 15.5 ms.str= "Chris" fmt.Printf("The int is: %d\n", ms.i1) fmt.Printf("The float is: %f\n", ms.f1) fmt.Printf("The string is: %s\n", ms.str) fmt.Println(ms) }
與物件導向語言相同,使用點運算子可以給欄位賦值:structname.fieldname = value。
同樣的,使用點操作子可以取得結構體欄位的值:structname.fieldname。
方式三:使用字面量
type Person struct { name string age int address string } func main() { var p1 Person p1 = Person{"lisi", 30, "shanghai"} //方式A p2 := Person{address:"beijing", age:25, name:"wangwu"} //方式B p3 := Person{address:"NewYork"} //方式C }
在(方式A)中,值必須以結構體定義時欄位在結構體定義時的順序給出。 (方式B)是在值前面加上了欄位名稱和冒號,這種方式下值的順序不必一致,並且某些欄位還可以被忽略掉,就想(方式C)那樣。
除了上面這三種方式外,還有一個初始化結構體實體更簡短和常用的方式,如下:
ms := &Person{"name", 20, "bj"} ms2 := &Person{name:"zhangsan"}
&Person{a, b, c} 是一種簡寫,底層仍會呼叫 new(),這裡值的順序必須按照字段順序來寫,同樣它也可以使用在值前面加上字段名和冒號的寫法(見上文的方式B,C)。
表達式 new(Type) 和 &Type{} 是等價的。
三,幾種初始化方式之間的差異
#到目前為止,我們已經了解了三種初始化結構體的方式:
//第一种,在Go语言中,可以直接以 var 的方式声明结构体即可完成实例化 var t T t.a = 1 t.b = 2 //第二种,使用 new() 实例化 t := new(T) //第三种,使用字面量初始化 t := T{a, b} t := &T{} //等效于 new(T)
使用 var t T 會給t 分配內存,並零值化內存,但是這個時候的t 的類型是T
使用new 關鍵字時 t := new(T) ,變數t 則是指向T 的指標
從記憶體佈局來看,我們就能看出這三種初始化方式的差異:
使用var 宣告:
使用new 初始化:
使用結構體字面量初始化:
下面來看一個具體的例子:
package main import "fmt" type Person struct { name string age int } func main() { var p1 Person p1.name = "zhangsan" p1.age = 18 fmt.Printf("This is %s, %d years old\n", p1.name, p1.age) p2 := new(Person) p2.name = "lisi" p2.age = 20 (*p2).age = 23 //这种写法也是合法的 fmt.Printf("This is %s, %d years old\n", p2.name, p2.age) p3 := Person{"wangwu", 25} fmt.Printf("This is %s, %d years old\n", p3.name, p3.age) }
輸出:
This is zhangsan, 18 years old This is lisi, 23 years old This is wangwu, 25 years old
上面範例的第二種情況,雖然p2 是指標類型,但我們還是可以像 p2.age = 23 這樣賦值,不需要像C 那樣使用 -> 運算子,Go 會自動進行轉換。
注意也可以先透過 * 運算子來取得指標所指向的內容,再進行賦值:(*p2).age = 23。
結構體的記憶體佈局
#Go 语言中,结构体和它所包含的数据在内存中是以连续块的形式存在的,即使结构体中嵌套有其他的结构体,这在性能上带来了很大的优势。不像 Java 中的引用类型,一个对象和它里面包含的对象可能会在不同的内存空间中,这点和 Go 语言中的指针很像。
下面的例子清晰地说明了这些情况:
type Rect1 struct {Min, Max Point } type Rect2 struct {Min, Max *Point }
更多go语言知识请关注PHP中文网go语言教程栏目。
以上是Go語言結構體與初始化圖文詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Golang和C 在性能競賽中的表現各有優勢:1)Golang適合高並發和快速開發,2)C 提供更高性能和細粒度控制。選擇應基於項目需求和團隊技術棧。

Golang適合快速開發和並發編程,而C 更適合需要極致性能和底層控制的項目。 1)Golang的並發模型通過goroutine和channel簡化並發編程。 2)C 的模板編程提供泛型代碼和性能優化。 3)Golang的垃圾回收方便但可能影響性能,C 的內存管理複雜但控制精細。

goimpactsdevelopmentpositationality throughspeed,效率和模擬性。 1)速度:gocompilesquicklyandrunseff,IdealforlargeProjects.2)效率:效率:ITScomprehenSevestAndardArdardArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdEcceSteral Depentencies,增強的Depleflovelmentimency.3)簡單性。

C 更適合需要直接控制硬件資源和高性能優化的場景,而Golang更適合需要快速開發和高並發處理的場景。 1.C 的優勢在於其接近硬件的特性和高度的優化能力,適合遊戲開發等高性能需求。 2.Golang的優勢在於其簡潔的語法和天然的並發支持,適合高並發服務開發。

Golang在实际应用中表现出色,以简洁、高效和并发性著称。1)通过Goroutines和Channels实现并发编程,2)利用接口和多态编写灵活代码,3)使用net/http包简化网络编程,4)构建高效并发爬虫,5)通过工具和最佳实践进行调试和优化。

Go語言的核心特性包括垃圾回收、靜態鏈接和並發支持。 1.Go語言的並發模型通過goroutine和channel實現高效並發編程。 2.接口和多態性通過實現接口方法,使得不同類型可以統一處理。 3.基本用法展示了函數定義和調用的高效性。 4.高級用法中,切片提供了動態調整大小的強大功能。 5.常見錯誤如競態條件可以通過gotest-race檢測並解決。 6.性能優化通過sync.Pool重用對象,減少垃圾回收壓力。

Go語言在構建高效且可擴展的系統中表現出色,其優勢包括:1.高性能:編譯成機器碼,運行速度快;2.並發編程:通過goroutines和channels簡化多任務處理;3.簡潔性:語法簡潔,降低學習和維護成本;4.跨平台:支持跨平台編譯,方便部署。

關於SQL查詢結果排序的疑惑學習SQL的過程中,常常會遇到一些令人困惑的問題。最近,筆者在閱讀《MICK-SQL基礎�...


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載
最受歡迎的的開源編輯器

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版
好用的JavaScript開發工具