exploit
1/28/2019 - 7:49 AM

go example code 5 - points

package main

import (
	"fmt"
)

func main() {
	// 声明一个指针
	var p *int 
	
	// 声明一个变量
	var p1 int = 10
	
	// 变量转为指针
	p = &p1
	
	// 打印出来地址
	fmt.Println(p)
	
	// 从这个地址取回来值
	fmt.Println(*p)
	//==============================================
	// 对于 struct 也是一样的
	type cat struct{}
	
	c := &cat{}
	
	// 打印出来 struct 的地址
	fmt.Println(c)
	
	// 打印 struct 的值
	fmt.Println(*c)
	//========================================
	// 针对数组却不一样
	arr := &[10]int {1,2,3,4,5,6,7,8,9,0}
	fmt.Println(arr[1]) //  打印出 2 而不需要使用 * 
	
	//=======================================
	
}
package main

import (
	"fmt"
)
type person struct{
	name string 
	age int
}

// 指针作为参数传递。 注意这个时候,类型是指针,必须要用 * 
func change(p *person) {
	p.name = "changed"
}

func change2(p person) {
	p.name = "changed2"
}

//============================================
// 指针传递给方法
func (p *person) add() {
	p.age++
}

// 不是指针
func (p person) add2() {
	p.age++
	fmt.Println(p.age) // 21 新的空间
}

func changeArr(a *[5]int) {
	a[1] = 111111111
}

func main() {
	// 函数中应用指针
	p1 := person{"john",20}
	change(&p1)
	fmt.Println(p1.name) // changed
	change2(p1)
	fmt.Println(p1.name) // changed. 这个时候是按值传递,而不是按引用传递,所以原来的对象名字不变!!
	//====================================================================================
	// 方法中,指针的使用
	p2 := person{"jack",19}
	p2.add()
	fmt.Println(p2.age) // 20
	fmt.Println(p1.age) // 20 说明了互不影响,两个对象之间的内存是相互独立的
	
	// 方法中不应用指针
	p2.add2()  
	fmt.Println(p2.age) // 20 没有继续增加,说明这个时候,按值传递,创建了一个新对象,分布在了不同空间
	fmt.Println(p1.age) // 20 说明了互不影响,两个对象之间的内存是相互独立的
	
	//=============================================
	// 数组中使用指针,不是指针不改变原来的数组
	arr := [...]int {1,2,3,4,5}
	changeArr(&arr)
	fmt.Println(arr)
}