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结构体,其中age是结构体的属性,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
-
}
go编译器规定此时只能创建Cat对象指针,如果创建Cat对象会出错:
-
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)
-
}
代码中定义了结构体Cat的Age()方法,通过关键词new生成一个Cat对象指针,我们可以通过cat.Age()或(*cat).Age()访问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)
-
}
结构体Cat定义了指针方法Age(),main()函数中生成了一个Cat的对象cat,可以通过cat.Age()或(&cat).Age()访问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())
-
}
运行:
cat的age没被修改,所以是默认初始值0,dog的age被修改了。
以上就是go语言中指针使用的简单说明,总体来说go的指针处理比C语言规则更宽松,但个人感觉这反而容易让初学者混淆。
阅读(3601) | 评论(0) | 转发(0) |