初学语言,使用中文解释了一遍,有助于理解
```
type Employee struct {
Id string
Name string
Age int
}
func TestCreateEmployeeObj(t *testing.T) {
e := Employee{"001", "Tom", 17}
e1 := Employee{Name: "Tom", Id: "001", Age: 17}
e2 := new(Employee) //这里是实例化一个 Employee 结构,但是返回的是 引用|指针 => e:= &Employee{}
e2.Age = 17
e2.Id = "007"
e2.Name = "Tom"
t.Log(e, e1, e2)
}
// 1.这个方法调用实例时,这个实例会复制一份出来用于调用,就浪费内存了
func (e Employee) SomrFunc1() string {
fmt.Printf("⚠️:SomrFunc1注意,使用非指针方式调用实例时,指针位置是不一样的, 说明数据被拷贝了一份")
fmt.Printf("\n非指针方式--- SomrFunc1 获取e.Name的地址 %x\n", unsafe.Pointer(&e.Name)) // 获取
return fmt.Sprintf("\n ID:%s\n Name:%s\n Age:%d", e.Id, e.Name, e.Age)
}
// 2.这个方法用实例时,我们直接使用指针来读取数据,就避免来内存浪费
func (e *Employee) SomrFunc2() string {
fmt.Printf("⚠️:SomrFunc2注意,使用非指针方式调用实例时,指针位置是一样的, 使用指针访问的话,可以避免拷贝带来的内存开销")
fmt.Printf("\n指针方式--- SomrFunc2 获取e.Name的地址 %x\n", unsafe.Pointer(&e.Name)) // 获取
return fmt.Sprintf("\n ID:%s\n Name:%s\n Age:%d", e.Id, e.Name, e.Age)
}
func TestStructOperations(t *testing.T) {
e := Employee{"0", "Tom", 17}
fmt.Printf("\n非指针方式--- SomrFunc1 获取e.Name的地址 %x\n", unsafe.Pointer(&e.Name)) // 获取
t.Log("\nSomrFunc1 Employee调用", e.SomrFunc1())
fmt.Printf("\n指针方式--- SomrFunc2 获取e.Name的地址 %x\n", unsafe.Pointer(&e.Name)) // 获取
t.Log("\nSomrFunc2 *Employee调用", e.SomrFunc2())
}
=== RUN TestStructOperations
非指针方式--- SomrFunc1 获取e.Name的地址 c000076370
⚠️:SomrFunc1注意,使用非指针方式调用实例时,指针位置是不一样的, 说明数据被拷贝了一份
非指针方式--- SomrFunc1 获取e.Name的地址 c0000c4010
指针方式--- SomrFunc2 获取e.Name的地址 c000076370
⚠️:SomrFunc2注意,使用非指针方式调用实例时,指针位置是一样的, 使用指针访问的话,可以避免拷贝带来的内存开销
指针方式--- SomrFunc2 获取e.Name的地址 c000076370
PASS
```
展开