当前位置: 首页 > article >正文

GO 语言基础3 struct 结构体

更多个人笔记见:
github个人笔记仓库
gitee 个人笔记仓库
个人学习,学习过程中还会不断补充~ (后续会更新在github上)

文章目录

  • strcut结构体
        • 基本例子
        • 传入数值和指针的区别
        • 初始化方法汇总
        • 结构体特点
            • 结构体方法定义基于另外一个结构体后,还是只能用自己的方法

strcut结构体

基本例子
package mainimport "fmt"type user struct {name     stringpassword string
}func main() {a := user{name: "wang", password: "1024"}b := user{"wang", "1024"}c := user{name: "wang"}c.password = "1024"var d userd.name = "wang"d.password = "1024"fmt.Println(a, b, c, d) // {wang 1024} {wang 1024} {wang 1024} {wang 1024}fmt.Println(checkPassword(a, "haha"))  // falsefmt.Println(checkPassword2(&a, "haha")) // false
}//不同传递方式
func checkPassword(u user, password string) bool {return u.password == password
}func checkPassword2(u *user, password string) bool {return u.password == password
}
传入数值和指针的区别
ackage mainimport "fmt"func main() {//一个类型的所有方法最好使用相同的接收器类型(要么都是值,要么都是指针)// 因为 u 是结构体,所以方法调用的时候它数据是不会变的u := User{Name: "Tom",Age:  10,}u.ChangeName("Tom Changed!")u.ChangeAge(100)fmt.Printf("%v \n", u)//{Tom 100}// 因为 up 指针,所以内部的数据是可以被改变的up := &User{Name: "Jerry",Age:  12,}// 因为 ChangeName 的接收器是结构体// 所以 up 的数据还是不会变up.ChangeName("Jerry Changed!")up.ChangeAge(120)//&{Jerry 120}fmt.Printf("%v \n", up)
}type User struct {Name stringAge  int
}// 结构体接收器
func (u User) ChangeName(newName string) {u.Name = newName
}// 指针接收器
func (u *User) ChangeAge(newAge int) {u.Age = newAge
} 
初始化方法汇总
func main(){//定义struct的方法// duck1 是 *ToyDuckduck1 := &ToyDuck{}duck1.Swim()duck2 := ToyDuck{}duck2.Swim()// duck3 是 *ToyDuckduck3 := new(ToyDuck)duck3.Swim()// 当你声明这样的时候,Go 就帮你分配好内存// 不用担心空指针的问题,以为它压根就不是指针var duck4 ToyDuckduck4.Swim()// duck5 就是一个指针了//var duck5 *ToyDuck// 这边会直接panic 掉,因为指针需要初始化!//duck5.Swim()// 建议添加初始化示例var duck5 *ToyDuck = &ToyDuck{Color: "红色",Price: 200,}duck5.Swim()// 赋值,初始化按字段名字赋值duck6 := ToyDuck{Color: "黄色",Price: 100,}duck6.Swim()// 初始化按字段顺序赋值,不建议使用duck7 := ToyDuck{"蓝色", 1024}duck7.Swim()// 后面再单独赋值duck8 := ToyDuck{}duck8.Color = "橘色"}// ToyDuck 玩具鸭
type ToyDuck struct {Color stringPrice uint64
}func (t *ToyDuck) Swim() {fmt.Printf("门前一条河,游过一群鸭,我是%s,%d一只\n", t.Color, t.Price)
} 
结构体特点
结构体方法定义基于另外一个结构体后,还是只能用自己的方法
func main() {fake := FakeFish{}// fake 无法调用原来 Fish 的方法//如果有一样的swim方法也会调用自己的!!!// 这一句会编译错误//fake.Swim()fake.FakeSwim()// 转换为Fishtd := Fish(fake)// 真的变成了鱼td.Swim()}// 定义了一个新类型,注意是新类型
type FakeFish Fishfunc (f FakeFish) FakeSwim() {fmt.Printf("我是山寨鱼,嘎嘎嘎\n")
}type Fish struct {
}func (f Fish) Swim() {fmt.Printf("我是鱼,假装自己是一直鸭子\n")
} 
  • 类型别名type fakeNews = News
http://www.lryc.cn/news/2386293.html

相关文章:

  • VSCode C/C++ 开发环境完整配置及一些扩展用途(自用)update:2025/3/31
  • iOS 上线前的性能与稳定性检查流程实录:开发者的“最后一公里”(含 KeyMob 应用经验)
  • Docker系列(二):开机自启动与基础配置、镜像加速器优化与疑难排查指南
  • a16z:AI带来了全新的9种开发软件的模式
  • 20.迭代器模式:思考与解读
  • Java 学习笔记:注解、泛型与 IO 流
  • 在 Excel 使用macro————仙盟创梦IDE
  • 【MySQL】08.视图
  • 鸿蒙devEco studio如何创建模拟器
  • 鸿蒙路由参数传递
  • springboot 控制层调用业务逻辑层,注入报错,无法自动装配 解决办法
  • MySQL:11_事务
  • Linux中的文件系统和软硬连接
  • 并发容器(Collections)
  • SPA模式下的es6如何加快宿主页的显示速度
  • windows powershell 判断 进程号是否存在
  • c# 解码 encodeURIComponent
  • Spring AI:Java开发者的AI开发新利器
  • Android System UI 深度解析:从架构演进到车载 / TV 场景的全维度定制
  • Spring Cloud Sleuth与Zipkin深度整合指南:微服务链路追踪实战
  • React从基础入门到高级实战:React 基础入门 - 列表渲染与条件渲染
  • 在 stm32 中 volatile unsigned signed 分别有什么作用,分别在什么场景下使用?
  • FreeBSD14.2因为爆内存而导致Xfce4视窗被卡,桌面变黑色,只能看到鼠标在窗体中心,鼠标无反应,键盘无反应
  • k8s-NetworkPolicy
  • spring-ai 集成 mcp 之投机取巧
  • 大语言模型的完整训练周期从0到1的体系化拆解
  • 历年北京邮电大学保研上机真题
  • elementUI 中el-date-picker和el-select的样式调整
  • 《仿盒马》app开发技术分享-- 定位获取(端云一体)
  • 黑马点评--基于Redis实现共享session登录