go语言中结构体如何定义方法和通过方法修改结构体中的值

值类型和引用类型

值类型:改变变量副本值的时候,不会改变变量本身的值(数组、基本数据类型、结构体)
引用类型: 改变变量副本值的时候,会改变变量本身的值(切片、map)

结构体,改变副本时不影响变量本身

package main
import ("fmt")

type Person struct {
  name string
  age int
}

func main()  {
	var p1 = Person{
		name: "张三",
		age: 18,
	}
	p2 := p1
	// 结构体,改变副本时不影响变量本身
	p2.name = "李四"
	fmt.Printf("%#v\n", p1)
	fmt.Printf("%#v", p2)
}

main.Person{name:"张三", age:18}
main.Person{name:"李四", age:18}

在 go 语言中,没有类的概念。
但是可以给类型(结构体,自定义类型)定义方法。
所谓方法:就是定义了接收者的函数。
接收者的概念就类似于其他语言中的 this 或者 self。
结构体方法的定义格式如下:
func (接收者变量 接收者类型) 方法名(参数列表) (返参数) {
方法体
}
结构体定义的方法与函数定义的方法有所不同

package main
import ("fmt")

type Person struct {
  name string
  age int
	sex string
}

// 如果没有返回类型,可以不写返回类型的哈
func (p Person) PersonInfo(){
 fmt.Printf("名称:%v",p.name)
}
func main()  {
	var p1 = Person{
		name:"张三",
		age:18,
		sex:"男",
	}
	p1.PersonInfo()
}

输出:名称:张三

通过方法修改结构体里面的值

package main
import ("fmt")

type Person struct {
  name string
  age int
	sex string
}

// 如果没有返回类型,可以不写返回类型的哈
func (p Person) PersonInfo(){
 fmt.Printf("名称:%v",p.name)
}
// 通过这样的方式可以修改结构体的值
func (p *Person) setName(name string) {
 p.name = name
}

// 结构体,是值类型,通过下面的方式不能修改age的值
func (p Person) setAge(age int) {
 p.age = age
}

func main()  {
	var p1 = Person{
		name:"张三",
		age:18,
		sex:"男",
	}
	p1.setName("张四")
	p1.setAge(10)
 	fmt.Printf("%#v", p1)
}
posted @ 2026-09-28 22:24  何人陪我共长生  阅读(10)  评论(0)    收藏  举报