1. 指针作为函数参数
go语言中指针作为函数参数时基本和C语言相同。先看代码- package main
- import (
- "fmt"
- )
- func UpdateA(x int) {
- x = 5
- }
- func UpdateB(x *int) {
- //x = 5 //compile error
- *x = 5
- }
- func main() {
- a := 4
- UpdateA(a)
- fmt.Printf("a = %d\n", a)
- b := 4
- //UpdateB(b) //compile error
- UpdateB(&b)
- fmt.Printf("b = %d\n", b)
- }
- # go run func.go
- a = 4
- b = 5
2. 方法中的指针
go语言的结构体类似于C++中的类,可以包含属性和方法。如:
- package main
- import (
- "fmt"
- )
- type Cat struct {
- age int
- }
- func (cat Cat) Age() int {
- return cat.age
- }
给对象分配内存可以用如下几种方式:
- cat := new(Cat) //返回Cat对象指针
- cat := &Cat{1} //内部会调用new(Cat),返回Cat对象指针
- cat := Cat{1} //返回Cat对象
但是,如果Cat结构体中有指针方法,就只能创建Cat对象指针
给上面的Cat结构体添加一个指针方法:
- func (cat *Cat) SetAge(x int) {
- cat.age = x
- }
- cat := Cat{1} //compile error
3. 调用方法时的指针使用
对于方法的调用,go和C++不同,go比较智能,指针方法和值方法都可以通过指针或非指针对象调用。例如:- type Cat struct {
- age int
- }
- func (cat Cat) Age() int {
- return cat.age
- }
- func main() {
- cat := new(Cat) //返回Cat对象指针
- age := cat.Age()//同age := (*cat).Age()
- fmt.Printf("%d\n", age)
- }
如果代码修改成:
- func (cat *Cat) Age() int {
- return cat.age
- }
- func main() {
- cat := Cat{age:1} //返回Cat对象
- age := cat.Age()//同age := (&cat).Age()
- fmt.Printf("%d\n", age)
- }
可见,go语言中结构体调用方法是很灵活的,编译过程中会自动完成转换。
4. 指针方法和值方法
和函数类似,指针方法可以修改结构体中的属性值,值方法由于传递的参数是结构体对象的副本,不能改变其属性值。测试代码如下:- package main
- import (
- "fmt"
- )
- type Cat struct {
- age int
- }
- func (cat Cat) Age() int {
- return cat.age
- }
- func (cat Cat) SetAge(x int) {
- cat.age = x
- }
- type Dog struct {
- age int
- }
- func (dog Dog) Age() int {
- return dog.age
- }
- func (dog *Dog) SetAge(x int) {
- dog.age = x
- }
- func main() {
- cat := new(Cat)
- cat.SetAge(5)
- fmt.Printf("%d\n", cat.Age())
- dog := new(Dog)
- dog.SetAge(5)
- fmt.Printf("%d\n", dog.Age())
- }
- # go run struct.go
- 0
- 5
以上就是go语言中指针使用的简单说明,总体来说go的指针处理比C语言规则更宽松,但个人感觉这反而容易让初学者混淆。