Go 指针 & 部分结构体

指针

	 //指针
	 a := 10            //int类型
	 b := &a            //int类型 int指针
	 fmt.Println(a, &a) //10 0xc0000b2008
	 fmt.Println(b)     // 0xc0000b2008

	 //指针变量
	 c := *b        //*是获取指针对应的变量
	 fmt.Println(c) //10

	//指针类型数据必须是有初始化值的
	 var a *int //nil
	 *a = 100   //无法对一个空指针赋值
	 fmt.Println(a)

	//new 函数 指针类型的初始化 各个类型的 零值(new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针)
	a := new(int)
	fmt.Println(a)  //0xc0000b2008
	fmt.Println(*a) //0

	bool := new(bool)
	fmt.Println(bool)  //0xc000012078
	fmt.Println(*bool) //false

	//make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身
//方法 : 是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于其他语言中的this或者 self

func (接收者变量 接收者类型) 方法名(参数列表) (返回参数) {
    函数体
}

接收者变量:接收者中的参数变量名在命名时,官方建议使用接收者类型名称首字母的小写,而不是self、this之类的命名。例如,Person类型的接收者变量应该命名为 p,Connector类型的接收者变量应该命名为c等。
接收者类型:接收者类型和参数类似,可以是指针类型和非指针类型。
方法名、参数列表、返回参数:具体格式与函数定义相同。


package main

import "fmt"

//结构体
type person struct {
	name, city string
	age        int8
}

//构造函数
func newPerson(name, city string, age int8) *person { //返回 指针类型
	return &person{//因为返回指针类型 所以 返回 取地址
		name: name,
		city: city,
		age:  age,
	}
}

//方法
func (p person) Dream() {
	fmt.Printf("%s我爱你", p.name)
}

func main() {
	p := newPerson("lwl", "杭州", 24)
	p.Dream()//调用
}

指针类型的接收者

package main

import "fmt"

type person struct {
	name, city string
	age        int8
}

func newPerson(name, city string, age int8) *person {
	return &person{
		name: name,
		city: city,
		age:  age,
	}
}


//指针类型的接收者
func (p *person) setAge() {
	p.age = 30
}

func main() {
	p := newPerson("lwl", "杭州", 24)
	fmt.Println(p.age) //24
	p.setAge()
	fmt.Println(p.age) //30
}

值类型的接收者

package main

import "fmt"

type person struct {
	name, city string
	age        int8
}

func newPerson(name, city string, age int8) *person {
	return &person{
		name: name,
		city: city,
		age:  age,
	}
}


//指针类型的接收者
func (p *person) setAge() {
	p.age = 30
}

//值类型的接收者
func (p person) setAge1(newAge int8) {
	p.age = newAge
}

func main() {
	p := newPerson("lwl", "杭州", 24)
	fmt.Println(p.age) //24
	p.setAge()
	fmt.Println(p.age) //30
	p.setAge1(50)
	fmt.Println(p.age) //30
}
总结:
需要修改接收者中的值
接收者是拷贝代价比较大的大对象
保证一致性,如果有某个方法使用了指针接收者,那么其他的方法也应该使用指针接收者。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值