zoukankan      html  css  js  c++  java
  • go 结构体指针方法与结构体方法的区别

    package main
    
    import "fmt"
    
    type Person struct {
    	name string
    	age  int
    }
    
    func (v *Person) modifyName(name string) {
    	p := v
    	p.name = name
    }
    
    func main() {
    	xiaoMing := Person{name: "xiaoming", age: 20}
    	xiaoMing.modifyName("小李")
    	fmt.Println(xiaoMing.name)
    }

    输出结果如下:

    C:UsersEthanDesktopGOStudy est>go run test.go
    小李

    将上面代码的改成接受结构体的修改名称方法

    package main
    
    import "fmt"
    
    type Person struct {
    	name string
    	age  int
    }
    
    func (v Person) modifyName(name string) {
    	p := v
    	p.name = name
    }
    
    func main() {
    	xiaoMing := Person{name: "xiaoming", age: 20}
    	xiaoMing.modifyName("小李")
    	fmt.Println(xiaoMing.name)
    }

    输出结果如下:

    C:UsersEthanDesktopGOStudy est>go run test.go
    xiaoming

    结论:

    接受为结构体指针的方法对原先定义的结构体能够改变名称

    接受为结构体的方法改变不了原先的结构体的值,需要重新定义个变量来传递新的值

    下面修改的代码可以实现同样的效果:

    package main

    import "fmt"

    type Person struct {
    name string
    age int
    }

    func (v Person) modifyName(name string) Person {
    p := v
    p.name = name
    return p
    }

    func main() {
    xiaoMing := Person{name: "xiaoming", age: 20}
    p:=xiaoMing.modifyName("小李")
    fmt.Println(p.name)
    }

    输出结果:

    C:UsersEthanDesktopGOStudy est>go run test.go
    小李

    总结:

    效率高的话还是使用结构体指针,直接修改

  • 相关阅读:
    【LVS 】NAT方式实现过程
    【 LVS 】类型及算法
    [ 总结 ] RHEL6/Centos6 使用OpenLDAP集中管理用户帐号
    [ 手记 ] 关于tomcat开机启动设置问题
    [ 总结 ] nginx 负载均衡 及 缓存
    Mac
    Swift
    Swift
    Cocoapods
    Swift
  • 原文地址:https://www.cnblogs.com/EthanSun/p/13725240.html
Copyright © 2011-2022 走看看