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

 

posted @ 2024-12-14 13:06  刘宏缔的架构森林  阅读(6)  评论(0编辑  收藏  举报