实例化
type 名称 struct {
// 成员变量
}
type Person struct {
Name string
Sex string
Age int
}
实例化对象的几种方式
person := Person{Name: "张三", Sex: "男", Age: 21}
person1 := Person{"李四", "男", 20}
person2 := new(Person) // 这里返回指针,相当于person2 := &Person{}
person2.Name = "王五"
person2.Sex = "女"
person2.Age = 30
行为(函数)的定义
方法一:
func (p Person) String() string {
fmt.Printf("Address is %x \n", unsafe.Pointer(&p))
return fmt.Sprintf("Name: %s - Sex: %s - Age: %d", p.Name, p.Sex, p.Age)
}
方法二:
func (p *Person) String() string {
fmt.Printf("Address is %x", unsafe.Pointer(p))
return fmt.Sprintf("Name: %s - Sex: %s - Age: %d", p.Name, p.Sex, p.Age)
}
建议使用第二种方式进行定义,不会有额外的内存拷贝
验证方式
package main
import (
"fmt"
"unsafe"
)
type Person struct {
Name string
Sex string
Age int
}
// 默认构造函数
func (p Person) String1() string {
fmt.Printf("Address is %x \n", unsafe.Pointer(&p))// 打印内存地址
return fmt.Sprintf("Name: %s - Sex: %s - Age: %d", p.Name, p.Sex, p.Age)
}
//默认构造函数
func (p *Person) String2() string {
fmt.Printf("Address is %x", unsafe.Pointer(p)) // 打印内存地址
return fmt.Sprintf("Name: %s - Sex: %s - Age: %d", p.Name, p.Sex, p.Age)
}
func main() {
person := Person{Name: "张三", Sex: "男", Age: 21}
fmt.Printf("Address is %x \n", unsafe.Pointer(&person))
person.String1()
person1 := Person{Name: "张三", Sex: "男", Age: 21}
fmt.Printf("Address is %x \n", unsafe.Pointer(&person1))
person1.String2()
}
输出结果
Address is c000060180
Address is c0000601b0
Address is c0000601e0
Address is c0000601e0
可以看出,第一种方式,进行了内存的拷贝。