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

Day09 Go语言深入学习(1)

1.结构体

声明 定义 结构体变量声明

type Books struct{title stringauthor stringbook_id int}

结构体作为函数参数时遇到的error:
(1)未使用包名作为前缀:
改正为:basic.Book。。。

(2)小写字母开头为未导出字段
在 Go 语言中,结构体字段的可访问性规则与结构体本身的可访问性规则类似:
● 大写字母开头的字段: 是导出的(Exported),可以在包外部被访问和赋值。
● 小写字母开头的字段: 是未导出的(Unexported),只能在定义它的包内部被访问和赋值。

2.接口

隐式实现 接口类型变量 零值接口 空接口 接口常见用法:(1)多态 (2)解耦 (3)泛化

2.1接口定义及实现

//定义接口
type  terface_name interface{method_name1 [return_type]method_name2 [return_type]```}
//定义结构体
type struct_name struct{
}//实现接口方法
func (struct_name_variable struct_name) method_name1() [return_type]{
}func (struct_name_variable struct_name) method_name2() [return_type]{
}
2.2 空接口
用于需要存储任意类型数据的场景,如泛型容器、通用参数等。
func printValue(val interface{}){fmt.Printf("Value: %v,Type:%T\n",val,val)
func main(){printValue(42)         // intprintValue("hello")    // stringprintValue(3.14)       // float64printValue([]int{1, 2}) // slice
}

2.3 类型断言

类型断言,如果不一致引发panic
类型断言有两种形式,单值形式(易panic),双值形式(推荐和常用)

if str,ok := i.(string); ok {   //if initialization_statement ; condition {...}fmt.Print("String:",str)
}
else{fmt.Print("not a string")
}

2.4 类型选择(type switch)

func printType(val interface{}) {switch v := val.(type) {case int:fmt.Println("Integer:", v)case string:fmt.Println("String:", v)case float64:fmt.Println("Float:", v)default:fmt.Println("Unknown type")}
}func main() {printType(42)printType("hello")printType(3.14)printType([]int{1, 2, 3})
}

2.5 接口组合

type Reader interface {Read() string
}type Writer interface {Write(data string)
}type ReadWriter interface {ReaderWriter
}type File struct{}func (f File) Read() string {return "Reading data"
}func (f File) Write(data string) {fmt.Println("Writing data:", data)
}func main() {var rw ReadWriter = File{}  //多态性  fmt.Println(rw.Read())rw.Write("Hello, Go!")
}

由var rw ReadWriter = File{} //多态性引发的一系列问题。
这行代码的意思是,一个ReadWriter接口类型的变量被声明出来之后,File类型赋值给rw。
问题一:
我理解的接口是待实现的方法,为什么接口能声明变量?
回答:
(1)接口是一种类型,因此可以声明接口类型的变量。(2)接口变量存储什么?接口变量可以存储任何实现了该接口的具体类型的值。比如File{ }结构体实现了ReadWriter接口里的方法,那么接口变量rw的动态类型被设置为File,动态值被设置为File{ }这个空结构体的实例。
问题二:
File结构体实现接口是什么意思?
回答:
一个类型实现接口,它被赋予两种能力:(1)直接调用它自己实现的方法 (2)被当作接口类型使用,从而可以通过接口变量进行多态调用。

http://www.dtcms.com/a/339913.html

相关文章:

  • 单片机编程架构
  • AttributeError: module ‘ffmpeg‘ has no attribute ‘probe‘
  • 【光学神经网络与人工智能应用专题】
  • 力扣hot100:三数之和(排序 + 双指针法)(15)
  • 深度学习-167-MCP技术之工具函数的设计及注册到MCP服务器的两种方式
  • 零售行业新店网络零接触部署场景下,如何选择SDWAN
  • 排查Redis数据倾斜引发的性能瓶颈
  • 缓存-变更事件捕捉、更新策略、本地缓存和热key问题
  • Autoware Universe 感知模块详解 | 第零节 如何学习开源框架(以Autoware Universe为例)
  • 新手入门:用 LangChain+LlamaIndex 构建 RAG,通义千问 API 免费够用
  • 机器人控制基础:串级 PID 和模糊 PID介绍与对比(干货总结)
  • Java 大视界 -- Java 大数据在智能物流无人配送车路径规划与协同调度中的应用
  • [激光原理与应用-303]:光学设计 - 光路设计的输出件
  • Git#cherry-pick
  • 【C语言16天强化训练】从基础入门到进阶:Day 3
  • 光纤通信系统的光纤计量详解-连续测量更高效
  • Protobuf安装和使用
  • 把 AI 变成「图书馆管理员」——基于检索增强的离线图书语音导航小盒子
  • 更新一个GMT新增的投影类型:Spilhaus投影
  • 融智兴“RFID物流周转箱卡”荣获2025“IOTE 金奖”创新产品奖
  • 全0子数组的数目-子数组问题
  • 项目里程碑设定有哪些方法
  • 猫头虎AI分享|字节开源了一款具备长期记忆能力的多模态智能体:M3-Agent 下载、安装、配置、部署教程
  • Visual Studio 中文件属性(在解决方案资源管理器中选中文件,按 F4 或在右键菜单 -> 属性)
  • 【树莓派】【嵌入式】远程树莓派,解决ping不通问题
  • 第5.6节:awk字符串运算
  • python新工具-uv包管理工具
  • 编排之神--Kubernetes中的网络通信-Flannel插件及Calico插件演练
  • Android SystemServer 中 Service 的创建和启动方式
  • Milvus 安装和启动指南