golang: struct与指针
一,可以通过指针访问struct的变量
1,代码:
package main
import (
"fmt"
"reflect"
)
//判断是否指针
func isPointer(v interface{}) bool {
return reflect.ValueOf(v).Kind() == reflect.Ptr
}
// 定义一个结构体
type Person struct {
Name string
Age int
}
func main() {
// struct可以通过指针直接访问
person := Person{Name: "Alice", Age: 30}
fmt.Println("person是否指针:", isPointer(person))
personPtr:=new(Person)
personPtr.Name="Tom"
fmt.Println("personPtr是否指针:", isPointer(personPtr))
ptr := &person
fmt.Println("person Name:", person.Name)
ptr.Name="Jerry"
fmt.Println("person Name:", person.Name)
(&person).Name="老刘"
fmt.Println("person Name:", person.Name)
}
2,测试效果
$ go run main.go
person是否指针: false
personPtr是否指针: true
person Name: Alice
person Name: Jerry
person Name: 老刘
二,方法返回struct变量时,也可以返回struct变量的指针
返回指针的好处:
当变量比较大时,传指针比传值效率要更高
1,代码:
package main
import (
"fmt"
"reflect"
)
//判断是否指针
func isPointer(v interface{}) bool {
return reflect.ValueOf(v).Kind() == reflect.Ptr
}
// 定义一个结构体
type Person struct {
Name string
Age int
}
//返回对象
func getOnePerson1() Person {
person := Person{Name: "Tom", Age: 30}
return person
}
//返回指向对象的指针
func getOnePerson2() *Person {
person := Person{Name: "Jerry", Age: 30}
return &person
}
func main() {
person1 := getOnePerson1()
fmt.Println("方法1返回的类型:",reflect.TypeOf(person1))
fmt.Println("方法1返回 是否指针:", isPointer(person1))
fmt.Println("person1 Name:", person1.Name)
person2 := getOnePerson2()
fmt.Println("方法2返回的类型:",reflect.TypeOf(person2))
fmt.Println("方法2返回 是否指针:", isPointer(person2))
fmt.Println("person2 Name:", person2.Name)
}
2,测试效果
$ go run main.go
方法1返回的类型: main.Person
方法1返回 是否指针: false
person1 Name: Tom
方法2返回的类型: *main.Person
方法2返回 是否指针: true
person2 Name: Jerry