go语言学习笔记——行为的定义和实现

143 阅读1分钟
实例化

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

可以看出,第一种方式,进行了内存的拷贝。