从JAVA和JS转过来的苦逼工程师,因为以上两门语言,一般情况下是没有指针的说法的,所以现在用go一通折腾,有时候就是引用指针傻傻分不清楚,或者声明指针未初始化报错的问题。不得已,写下此博客,记录自己菜鸟之路。
指针
// 定义一个结构体
type Person struct{
Name string
Age int
}
var Pperson *Person // 声明类型为Person的指针
// fmt.Println(Pperson.Name) // 此时会报错,因为Pperson为nil,所以无论如何,要使用指针类型,必须先初始化!!!
Pperson = new(Person) // go中 new(type) 返回的是指针
Pperson = &Person{} // 或者这种方式初始化
函数
func (p Person) SetName(name string){
p.Name=name
}
func (p *Person) SetNameP (name string){
p.Name=name
}
func main(){
person := Person{Name:"Jon",}
fmt.Println(person.Name) //Jon
person.SetName("Tom")
fmt.Println(person.Name) //Jon
person.SetNameP("Tom")
fmt.Println(person.Name) //Tom
}
只是一个在JAVA看起来很奇怪的问题,在面向对象语言的思维中,结果应该是 Jon /Tom / Tom,原因在于Golang的指针类型和值类型。
func (p Person) SetName(name string)
在调用的时候,实际是把 person 拷贝了一份 ,然后再函数里面对拷贝的变量进行赋值,结果并未改变原来的值。
func (p *Person) SetNameP (name string)
相当于把person的指针传入了函数内,然后在函数内通过指针改变了值真实地址内部的Name
值,所以才能打印出Tom。