例項建立及初始化
-
基本使用
func TestInitEmployee(t *testing.T) { type Employee struct { Id int Name string Age int } e := Employee{"0", "Bob", 20} e1 := Employee{name: "Ali", Age: 30} // 注意這裡返回的引用/指標, 相當於 e:= &Employee{} e2 := new(Employee) // 與其他的程式語言不同, 可以不用 -> 的方式來訪問指定的屬性 e2.Id = "2" e2.Age = 23 e2.Name = "Ali" // 訪問 t.Log(e1.Id) // 0 t.Logf("e is %T", e) // e is employee_test.Employee 前面如果加上 & 那麼返回的也是 指標型別 t.Logf("e2 is %T", e2) // e2 is *employee_test.Employee 這個是指標型別 }
-
非指標傳遞會生成一個新的結構物件,其中每個成員會複製。指標傳遞,只是傳遞指標,且該指標指向原有結構。
// 這一種,定義方式在例項對應方法變呼叫的時候 ,例項的成員會進行值複製
func (e Employee) String() string {
fmt.Printf("輸出自己的e的地址 %x\n", unsafe.Pointer(&e.Name)) // c00000a0e8
return fmt.Sprintf("ID :%d-Name:%s-Age:%d", e.Id, e.Name, e.Age)
}
// 在通常情況下避免記憶體拷貝我們使用 這種方式
func (e *Employee) String() string {
fmt.Printf("輸出自己的e的地址 %x\n", unsafe.Pointer(&e.Name)) // c00000a0e8
return fmt.Sprintf("ID :%d/Name:%s/Age:%d", e.Id, e.Name, e.Age)
}
// 測試 String 方法
func TestInit(t *testing.T) {
e := Employee{1, "Bob", 20}
// 第一種
// t.Log(e.String()) // ID :1-Name:Bob-Age:20
fmt.Printf("輸出傳進來的e的地址 %x\n", unsafe.Pointer(&e.Name)) // c00000a108
// 第二種
t.Log(e.String()) // ID :1/Name:Bob/Age:20
fmt.Printf("輸出傳進來的e的地址 %x\n", unsafe.Pointer(&e.Name)) // c00000a0e8
}
如想看學習記錄同步的練習程式碼移步 GitHub 。
本作品採用《CC 協議》,轉載必須註明作者和本文連結