准備工作:
定義結構體:Student
import (
"fmt"
"reflect"
)
type Student struct { StudentId string `json:"sid"` StudentName string `json:"sname"` StudentClass string `json:"class"` StudentTeacher string `json:"class"` }
測試代碼如下:
func main() { s0 := Student{} fmt.Println(s0) fmt.Println(reflect.TypeOf(s0)) s1 := new(Student) fmt.Println(s1) fmt.Println(reflect.TypeOf(s1)) s2 := &Student{} fmt.Println(s2) fmt.Println(reflect.TypeOf(s2)) s3 := &Student{"", "", "100", "200"} fmt.Println(s3) fmt.Println(reflect.TypeOf(s3)) s4:= &Student{StudentId: "100", StudentName: "200"} fmt.Println(s4) fmt.Println(reflect.TypeOf(s4)) }
輸出結果:
{ } main.Student &{ } *main.Student &{ } *main.Student &{ 100 200} *main.Student &{100 200 } *main.Student
注意:
除了s0以外,s1-s4變量全部為指向Rect結構的指針(指針變量),因為使用了new()函數和&操作符
而s0的方法 s0 := Student{} 表示的是一個Student類型,兩者是不一樣的
在Go語言中,未進行初始化的變量都會被初始化為該類型的零值,例如bool類型的零值為false, int類型的零值為0, string類型的零值為空字符串. 在Go語言中沒有構造函數的概念,對象的創建通常交由一個全局的創建函數來完成,以NewXXX來命令,表示"構造函數":
func NewStudent() {
return &Student() //返回指針
}
用 new 分配內存 內建函數 new 本質上說跟其他語言中的同名函數功能一樣:new(T) 分配了零值填充的 T 類型的內存空間,並且返回其地址,一個 *T 類型的值。
務必記得 make 僅適用於 map,slice 和 channel,並且返回的不是指針。應當用 new獲得特定的指針。
參考:
