原文:https://www.cnblogs.com/xuweiqiang/p/13957519.html
package main import ( "log" "sync" ) func main() { var a struct { Name string sync.RWMutex } a.Name = "aa" log.Println(a) }
這樣也可以定義struct變量
-------------------------------------------
truct很常見,所有的package里面幾乎都有定義一個struct結構體
var b struct{ name string }
然后不斷地
func (b *b) GetName() string { return b.name }
擴展方法
但是也可以聲明一個struct 然后直接賦予變量值
var dd struct{ CaptchaID string } dd.CaptchaID = "123"
等同於
dd := struct { CaptchaID string }{ "123", }
aaa
----------------------------------------
使用結構類型聲明變量,並初始化為零值
var nick Person
關鍵字 var 創建了類型為 Person 且名為 nick 的變量。nick 被稱作類型 Person
的一個實例(instance)或對象(object)。注意:當聲明變量時,這個變量對應的值總是會被初始化。這個值要么用指定的值初始化,要么用零值(即變量類型的默認值)做初始化。對數值類型來說,零值是
0;對字符串來說,零值是空字符串;對布爾類型,零值是 false。
通過上面的方式聲明結構體類型的變量,結構體里的每個字段都會用零值初始化。任何時候,創建一個變量並初始化為零值,習慣上會使用關鍵字
var。這種用法是為了更明確地表示一個變量被設置為零值。
使用結構體字面量聲明變量,並初始化為非零值
如果希望變量被初始化為某個非零值,可以通過結構體字面量和短變量聲明操作符(:=)來創建變量。下面的代碼展示了如何聲明一個 Persion
類型的變量,並使用某個非零值作為初始值。
// 聲明 Person 類型的變量,並初始化所有字段 nick := Person{ Name: "nick", Age: 28, Email: "
nickli@xxx.com", }
在第一行中我們給出了一個變量名 nick,之后是短變量聲明操作符。這個操作符是冒號加一個等號
(:=)。一個短變量聲明操作符在一次操作中完成兩件事情:聲明一個變量,並初始化。短變量聲明操作符會使用右側給出的類型信息作為聲明變量的類型。
短變量聲明操作符(:=)
它的作用是聲明並且賦值一個變量,其好處是不需要寫 var 三個字母,另外不需要寫類型,Golang 語言會自動根據賦值的內容確定類型。
使用短變量聲明操作符也有一些限制,比如不能在函數外面使用,即不能用來聲明全局變量。另外短變量聲明操作符左邊至少得有一個變量是沒有定義過的。
字面量的兩種寫法
結構體字面量可以對結構體類型進行初始化,比如前面介紹過的示例:
nick := Person{ Name: "nick", Age: 28, Email: "nickli@xxx.com", }
這種形式在不同行聲明每個字段的名字以及對應的值。字段名與值用冒號分隔,每一行以逗號結尾。這種形式對字段的聲明順序沒有要求。
第二種形式沒有字段名,只聲明對應的值,如下面的代碼:
nick := Person{"nick", 28, "nickli@xxx.com"}
每個值也可以分別占一行,不過習慣上這種形式會寫在一行里,結尾不需要逗號。這種形式下,值的順序很重要,必須要和結構聲明中字段的順序一致。
new 函數
new 是一個用來分配內存的內置函數,但是與 C++ 不一樣的是,它並不初始化內存,只是將其置零。也就是說,new(T) 會為類型 T
分配被置零的內存,並且返回它的地址,一個類型為 *T 的值。在 Golang 的術語中,其返回一個指向新分配的類型為 T
的指針,這個指針指向的內容的值為零(zero value)。比如下面的代碼:
nick := new(Person)
這里的變量 nick 是一個指針:
fmt.Printf("%T", nick)
輸出的結果為:*main.Student
而通過下面方式聲明的變量:
var nick Person
類型則是:main.Student
使用 new 函數時,聲明變量和分配內存並不需要放在一起,可以先聲明一個變量,然后再通過 new 函數為之分配內存,比如下面的寫法:
var nick *Person
nick = new (Person)
var nick Person
關鍵字 var 創建了類型為 Person 且名為 nick 的變量。nick 被稱作類型 Person
的一個實例(instance)或對象(object)。注意:當聲明變量時,這個變量對應的值總是會被初始化。這個值要么用指定的值初始化,要么用零值(即變量類型的默認值)做初始化。對數值類型來說,零值是
0;對字符串來說,零值是空字符串;對布爾類型,零值是 false。
通過上面的方式聲明結構體類型的變量,結構體里的每個字段都會用零值初始化。任何時候,創建一個變量並初始化為零值,習慣上會使用關鍵字
var。這種用法是為了更明確地表示一個變量被設置為零值。
使用結構體字面量聲明變量,並初始化為非零值
如果希望變量被初始化為某個非零值,可以通過結構體字面量和短變量聲明操作符(:=)來創建變量。下面的代碼展示了如何聲明一個 Persion
類型的變量,並使用某個非零值作為初始值。
// 聲明 Person 類型的變量,並初始化所有字段 nick := Person{ Name: "nick", Age: 28, Email: "
nickli@xxx.com", }
在第一行中我們給出了一個變量名 nick,之后是短變量聲明操作符。這個操作符是冒號加一個等號
(:=)。一個短變量聲明操作符在一次操作中完成兩件事情:聲明一個變量,並初始化。短變量聲明操作符會使用右側給出的類型信息作為聲明變量的類型。
短變量聲明操作符(:=)
它的作用是聲明並且賦值一個變量,其好處是不需要寫 var 三個字母,另外不需要寫類型,Golang 語言會自動根據賦值的內容確定類型。
使用短變量聲明操作符也有一些限制,比如不能在函數外面使用,即不能用來聲明全局變量。另外短變量聲明操作符左邊至少得有一個變量是沒有定義過的。
字面量的兩種寫法
結構體字面量可以對結構體類型進行初始化,比如前面介紹過的示例:
nick := Person{ Name: "nick", Age: 28, Email: "nickli@xxx.com", }
這種形式在不同行聲明每個字段的名字以及對應的值。字段名與值用冒號分隔,每一行以逗號結尾。這種形式對字段的聲明順序沒有要求。
第二種形式沒有字段名,只聲明對應的值,如下面的代碼:
nick := Person{"nick", 28, "nickli@xxx.com"}
每個值也可以分別占一行,不過習慣上這種形式會寫在一行里,結尾不需要逗號。這種形式下,值的順序很重要,必須要和結構聲明中字段的順序一致。
new 函數
new 是一個用來分配內存的內置函數,但是與 C++ 不一樣的是,它並不初始化內存,只是將其置零。也就是說,new(T) 會為類型 T
分配被置零的內存,並且返回它的地址,一個類型為 *T 的值。在 Golang 的術語中,其返回一個指向新分配的類型為 T
的指針,這個指針指向的內容的值為零(zero value)。比如下面的代碼:
nick := new(Person)
這里的變量 nick 是一個指針:
fmt.Printf("%T", nick)
輸出的結果為:*main.Student
而通過下面方式聲明的變量:
var nick Person
類型則是:main.Student
使用 new 函數時,聲明變量和分配內存並不需要放在一起,可以先聲明一個變量,然后再通過 new 函數為之分配內存,比如下面的寫法:
var nick *Person
nick = new (Person)