go语言八股文

1.go语言的接口是怎么实现

接口(interface)是一种类型,它定义了一组方法的集合。任何类型只要实现了接口中定义的所有方法,就被认为实现了该接口。

代码的实现

package mainimport "fmt"// 定义接口
type Shape interface {Area() float64Perimeter() float64
}// 定义实现接口的类型
type Rectangle struct {Width  float64Height float64
}// 实现接口方法
func (r Rectangle) Area() float64 {return r.Width * r.Height
}func (r Rectangle) Perimeter() float64 {return 2 * (r.Width + r.Height)
}func main() {// 使用接口var s Shaperect := Rectangle{Width: 4, Height: 5}s = rectfmt.Println("面积:", s.Area())       // 输出: 面积: 20fmt.Println("周长:", s.Perimeter())  // 输出: 周长: 18
}

理解与记忆方法
1接口是方法的集合:接口定义了一组方法,任何类型实现了这些方法就实现了接口。
2隐式实现:Go 不需要显式声明实现某个接口,只要类型的方法集包含接口的所有方法即可。
3空接口:interface{} 是最通用的接口,可存储任何类型值,用于灵活性需求。
4接口值的内部结构:接口值包含动态类型信息和实际数据值,支持类型断言和类型切换。
5鸭子类型:如果一个东西走起来像鸭子,叫起来也像鸭子,那么它就是鸭子。即,只要类型实现了接口的方法,就被认为实现了接口。

2.go语言使用断言时会发生拷贝吗

**类型断言是否会发生拷贝,取决于接口值的存储方式

场景 1:接口存储的是值类型(直接拷贝)

场景 2:接口存储的是指针类型(不拷贝)

3.go语言中如何访问私有成员

1.导出公有方法【推荐度:★★★★★】(get和set)
package mainimport "fmt"// 定义一个结构体
type Person struct {name string  // 私有字段age  int     // 私有字段
}// 导出 Get 方法 - 获取 name
func (p *Person) GetName() string {return p.name
}// 导出 Set 方法 - 设置 name
func (p *Person) SetName(newName string) {p.name = newName
}// 导出 Get 方法 - 获取 age
func (p *Person) GetAge() int {return p.age
}// 导出 Set 方法 - 设置 age
func (p *Person) SetAge(newAge int) {if newAge >= 0 {p.age = newAge} else {fmt.Println("年龄不能为负数")}
}func main() {// 创建 Person 实例person := Person{name: "张三",age:  25,}// 调用 Get 方法fmt.Println("姓名:", person.GetName()) // 输出: 姓名: 张三fmt.Println("年龄:", person.GetAge())  // 输出: 年龄: 25// 调用 Set 方法person.SetName("李四")person.SetAge(30)fmt.Println("新姓名:", person.GetName()) // 输出: 新姓名: 李四fmt.Println("新年龄:", person.GetAge())  // 输出: 新年龄: 30// 测试设置非法年龄person.SetAge(-5) // 输出: 年龄不能为负数
}
2.反射(reflect包)【推荐度:★★★】
导入反射包:在代码中导入 reflect 包。
获取反射对象:使用 reflect.TypeOf 获取类型的反射对象,reflect.ValueOf 获取值的反射对象。
获取字段:通过反射对象的 FieldByName 或 Fields 方法获取结构体的字段。
设置可导出性:如果字段是私有的(小写开头),需要通过反射设置其可导出性(CanSet)。
访问和修改字段:使用反射对象的 Interface 方法获取字段的值,Set 方法修改字段的值
package mainimport ("fmt""reflect"
)// 定义一个结构体
type Person struct {name string  // 私有字段age  int     // 私有字段
}func main() {// 创建 Person 实例person := Person{name: "张三",age:  25,}// 使用反射访问私有字段accessPrivateField(&person)
}// 使用反射访问私有字段
func accessPrivateField(obj interface{}) {// 获取反射对象val := reflect.ValueOf(obj).Elem() // 获取指针对应的值// 获取 name 字段nameField := val.FieldByName("name")if nameField.CanSet() {fmt.Println("name 字段值:", nameField.Interface())// 修改 name 字段值nameField.SetString("李四")}// 获取 age 字段ageField := val.FieldByName("age")if ageField.CanSet() {fmt.Println("age 字段值:", ageField.Interface())// 修改 age 字段值ageField.SetInt(30)}// 打印修改后的值fmt.Println("修改后的 person:", obj.(*Person))
}
3.同包内直接访问【推荐度:★★★★】

 

自学go语言笔记,希望我们可以一起学习!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/77990.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kafka auto.offset.reset详解

在 Kafka 中,auto.offset.reset latest 的含义及行为如下: 1. ​​核心定义​​ 当消费者组​​首次启动​​或​​无法找到有效的 offset​​(例如 offset 过期、被删除或从未提交)时,消费者会从分区的​​最新位置…

深度学习-损失函数

目录 1. 线性回归损失函数 1.1 MAE损失 1.2 MSE损失 2. CrossEntropyLoss 2.1 信息量 2.2 信息熵 2.3 KL散度 2.4 交叉熵 3. BCELoss 4. 总结 1. 线性回归损失函数 1.1 MAE损失 MAE(Mean Absolute Error,平均绝对误差)通常也被称…

第六篇:linux之解压缩、软件管理

第六篇:linux之解压缩、软件管理 文章目录 第六篇:linux之解压缩、软件管理一、解压和压缩1、window压缩包与linux压缩包能否互通?2、linux下压缩包的类型3、打包与压缩 二、软件管理1、rpm1、什么是rpm?2、rpm包名组成部分3、如何…

Redis 键管理

Redis 键管理 以下从键重命名、随机返回键、键过期机制和键迁移四个维度展开详细说明,结合 Redis 核心命令与底层逻辑进行深入分析: 一、键重命名 1. ​RENAME​​ 与 ​RENAMENX​​ **RENAME key newkey​**: 功能:强制重命名…

OpenCV 模板匹配方法详解

文章目录 1. 什么是模板匹配?2. 模板匹配的原理2.1数学表达 3. OpenCV 实现模板匹配3.1基本步骤 4. 模板匹配的局限性5. 总结 1. 什么是模板匹配? 模板匹配(Template Matching)是计算机视觉中的一种基础技术,用于在目…

TextCNN 模型文本分类实战:深度学习在自然语言处理中的应用

在自然语言处理(NLP)领域,文本分类是研究最多且应用最广泛的任务之一。从情感分析到主题识别,文本分类技术在众多场景中都发挥着重要作用。最近,我参与了一次基于 TextCNN 模型的文本分类实验,从数据准备到…

Qt-创建模块化.pri文件

文章目录 一、.pri文件的作用与基本结构作用基本结构 二、创建.pri文件如何添加模块代码? 一、.pri文件的作用与基本结构 作用 在Qt开发中,.pri文件(Project Include File)是一种配置包含文件,用于模块化管理和复用项…

SpringCloud组件——Eureka

一.背景 1.问题提出 我们在一个父项目下写了两个子项目,需要两个子项目之间相互调用。我们可以发送HTTP请求来获取我们想要的资源,具体实现的方法有很多,可以用HttpURLConnection、HttpClient、Okhttp、 RestTemplate等。 举个例子&#x…

EAL4+与等保2.0:解读中国网络安全双标准

EAL4与等保2.0:解读中国网络安全双标准 在当今数字化时代,网络安全已成为各个行业不可忽视的重要议题。特别是在金融、政府、医疗等领域,保护信息的安全性和隐私性显得尤为关键。在中国,EAL4和等级保护2.0(简称“等保…

FFmpeg+Nginx+VLC打造M3U8直播

一、视频直播的技术原理和架构方案 直播模型一般包括三个模块:主播方、服务器端和播放端 主播放创造视频,加美颜、水印、特效、采集后推送给直播服务器 播放端: 直播服务器端:收集主播端的视频推流,将其放大后推送给…

【Redis】缓存三剑客问题实践(上)

本篇对缓存三剑客问题进行介绍和解决方案说明,下篇将进行实践,有需要的同学可以跳转下篇查看实践篇:(待发布) 缓存三剑客是什么? 缓存三剑客指的是在分布式系统下使用缓存技术最常见的三类典型问题。它们分…

Flink 2.0 编译

文章目录 Flink 2.0 编译第一个问题 java 版本太低maven 版本太低maven 版本太高开始编译扩展多版本jdk 配置 Flink 2.0 编译 看到Flink2.0 出来了,想去玩玩,看看怎么样,当然第一件事,就是编译代码,但是没想到这么多问…

获取印度股票市场列表、查询IPO信息以及通过WebSocket实时接收数据

为了对接印度股票市场,获取市场列表、查询IPO信息、查看涨跌排行榜以及通过WebSocket实时接收数据等步骤。 1. 获取市场列表 首先,您需要获取支持的市场列表,这有助于了解哪些市场可以交易或监控。 请求方法:GETURL&#xff1a…

云原生--CNCF-1-云原生计算基金会介绍(云原生生态的发展目标和未来)

1、CNCF定义与背景 云原生计算基金会(Cloud Native Computing Foundation,CNCF)是由Linux基金会于2015年12月发起成立的非营利组织,旨在推动云原生技术的标准化、开源生态建设和行业协作。其核心目标是通过开源项目和社区协作&am…

【Rust 精进之路之第5篇-数据基石·下】复合类型:元组 (Tuple) 与数组 (Array) 的定长世界

系列: Rust 精进之路:构建可靠、高效软件的底层逻辑 作者: 码觉客 发布日期: 2025-04-20 引言:从原子到分子——组合的力量 在上一篇【数据基石上】中,我们仔细研究了 Rust 的四种基本标量类型&#xff1…

MongoDB 集合名称映射问题

项目场景 在使用 Spring Data MongoDB 进行开发时,定义了一个名为 CompetitionSignUpLog 的实体类,并创建了对应的 Repository 接口。需要明确该实体类在 MongoDB 中实际对应的集合名称是 CompetitionSignUpLog 还是 competitionSignUpLog。 问题描述 …

物联网 (IoT) 安全简介

什么是物联网安全? 物联网安全是网络安全的一个分支领域,专注于保护、监控和修复与物联网(IoT)相关的威胁。物联网是指由配备传感器、软件或其他技术的互联设备组成的网络,这些设备能够通过互联网收集、存储和共享数据…

PCB原理图解析(炸鸡派为例)

晶振 这是外部晶振的原理图。 32.768kHz 的晶振,常用于实时时钟(RTC)电路,因为它的频率恰好是一天的分数(32768 秒),便于实现秒计数。 C25 和 C24:两个 12pF 的电容,用于…

Jupyter Notebook 中切换/使用 conda 虚拟环境的方式(解决jupyter notebook 环境默认在base下面的问题)

使用 nb_conda_kernels 添加所有环境 一键添加所有 conda 环境 conda activate my-conda-env # this is the environment for your project and code conda install ipykernel conda deactivateconda activate base # could be also some other environment conda in…

【JAVA】十三、基础知识“接口”精细讲解!(二)(新手友好版~)

哈喽大家好呀qvq,这里是乎里陈,接口这一知识点博主分为三篇博客为大家进行讲解,今天为大家讲解第二篇java中实现多个接口,接口间的继承,抽象类和接口的区别知识点,更适合新手宝宝们阅读~更多内容持续更新中…