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

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.xdnf.cn/news/8758.html

相关文章:

  • GO 语言进阶之 Template 模板使用
  • 使用中文作为map的可以,需要注意什么
  • linux学习第15天(递归遍历目录实现-ls -R)
  • 【C语言练习】062. 使用位运算优化算法
  • Lua基础语法
  • Linux 内核学习(9) --- Linux sysfs 文件系统
  • 【Redis】浅谈分布式系统
  • libevent2-介绍
  • 深入理解 JavaScript 面向对象编程与 Class
  • EPD_2IN7_V2_Clear() 和 Paint_Clear(WHITE) 的区别
  • 深度解析视频剪辑SDK开发:从AI字幕提取到多端原生插件集成-优雅草卓伊凡
  • 小白的进阶之路系列之四----人工智能从初步到精通pytorch自定义数据集上
  • Hertz+Kitex快速上手开发
  • 学习日志12 java
  • 低功耗蓝牙BLE之LE Controller Package CRC校验
  • MySQL 定时逻辑备份
  • uni-app学习笔记十二-vue3中组件传值(属性传值)
  • 解决DeepSeek部署难题:提升效率与稳定性的关键策略
  • 《JavaScript 性能优化:从原理到实战的全面指南》
  • vue3中自定义指令使用
  • Vue3 watch 使用与注意事项
  • 在Mathematica中,使用鸟枪法求解在无穷远处的边值常微分方程
  • 动态规划算法:字符串类问题(2)公共串
  • 简单血条于小怪攻击模板
  • 【Linux】深刻理解OS管理
  • Java 8 Stream操作示例
  • 《仿盒马》app开发技术分享-- 原生地图展示(端云一体)
  • 【Python】1. 基础语法(1)
  • webpack优化方法
  • 学习日记-day15-5.25