struct 結構體 -Go 學習記錄

Ali發表於2019-03-15

例項建立及初始化

  • 基本使用

    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 協議》,轉載必須註明作者和本文連結

高永立

相關文章