golang学习笔记-struct方法

这篇博客探讨了Golang中struct的方法,强调了它们在面向对象编程中的角色,特别是如何通过struct实现封装特性。虽然内容简短,作者计划在后续文章中单独讨论继承和多态等主题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


嗯,要警惕负能量,要热爱学习,怎么能一谈到学习就是负能量的话,要给自己打鸡血


在这里插入图片描述


方法是作用在指定数据类型上,与对应类型是绑定关系

package main

import "fmt"

type Person struct {
	Name string
}

//func (绑定的类型) 方法名(参数列表) 返回值列表
func (p Person) printName() {
	//此处的p与其他语言(java)中的this有异曲同工之处
	fmt.Println(p.Name)
}

//调用changeName函数的只能是Person类型的变量,且对应的(p Person)中的p只是调用
//该函数变量的副本(值拷贝) 与变量类型有关(值类型变量值拷贝,引用类型则为地址拷贝)
func (p Person) changeName(newName string) {
	fmt.Printf("change name p %p \n", &p)
	p.Name = newName
}

func (p *Person) setName(newName string) {
	p.Name = newName
	fmt.Printf("change name p %p \n", p)
}

type MyInt int

func (m MyInt) printVal() {
	fmt.Println("myint -------- ", m)
}
func main() {
	tom := Person{}
	tom.printName()
	fmt.Printf("main p %p \n", &tom)
	tom.changeName("tom")
	tom.printName()
	//方法与绑定的类型密切相关,此处为Person的指针类型调用对应的方法,
	//由于方法绑定的是Person类型,方法中只会是值拷贝
	(&tom).changeName("tom")
	tom.printName()
	//setName绑定的是Person的指针类型,此时是地址拷贝
	(&tom).setName("tom")
	tom.printName()
	//go在编译时对调用指针类型方法进行了优化
	//(&tom)可以直接简写成tom
	tom.setName("big-tom")
	tom.printName()

	//方法作用在指定的数据类型上,任何自定义类型都可以有方法
	var m MyInt = 101
	m.printVal()
}


至此不难看出,struct是golang的面向对象的体现

package main

import (
	"fmt"
	"math/rand"
)

type Visitor struct {
	No   int
	Name string
	Age  byte
}

func (v Visitor) SayHi() {
	fmt.Printf("%v 欢迎光临! \n", v.Name)
}

//直接定义成对应类型的指针方法更便于操作
func (v *Visitor) LineUp() {
	if v.Age > 60 {
		fmt.Println("老年人优先,无需排队")
		v.No = -1
	} else {
		v.No = rand.Intn(1000)
		fmt.Printf("%v当前排%v号\n", v.Name, v.Age)
	}
}

func main() {
	tom := Visitor{
		Name: "tom",
		Age:  80,
	}
	tom.SayHi()
	tom.LineUp()
	//直接获取对象的指针
	dean := &Visitor{
		Name: "dean",s
		Age:  15,
	}
	dean.SayHi()
	dean.LineUp()
}


struct定义属性和绑定方法体现的是面向对象的封装特性,本打算把继承和多态也放到一起的,看了看还是再另起一篇吧。


这一篇内容这么少竟然是分两次写的……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值