go语言八股文

news2025/4/23 15:50:43

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

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

代码的实现

package main

import "fmt"

// 定义接口
type Shape interface {
    Area() float64
    Perimeter() float64
}

// 定义实现接口的类型
type Rectangle struct {
    Width  float64
    Height 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 Shape
    rect := Rectangle{Width: 4, Height: 5}
    s = rect

    fmt.Println("面积:", s.Area())       // 输出: 面积: 20
    fmt.Println("周长:", s.Perimeter())  // 输出: 周长: 18
}

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

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

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

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

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

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

1.导出公有方法【推荐度:★★★★★】(get和set)
package main

import "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 main

import (
	"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.coloradmin.cn/o/2340879.html

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

相关文章

基于 DeepSeek大模型 开发AI应用的理论和实战书籍推荐,涵盖基础理论、模型架构、实战技巧及对比分析,并附表格总结

以下是基于 DeepSeek大模型 开发AI应用的理论和实战书籍推荐,涵盖基础理论、模型架构、实战技巧及对比分析,并附表格总结: 1. 推荐书籍及内容说明 (1) 《深度学习》(Deep Learning) 作者:Ian Goodfellow…

从数字化到智能化,百度 SRE 数智免疫系统的演进和实践

1. 为什么 SRE 需要数智免疫系统? 2022 年 10 月,在 Gartner 公布的 2023 年十大战略技术趋势中提到了「数字免疫系统」的概念,旨在通过结合数据驱动的一系列手段来提高系统的弹性和稳定性。 在过去 2 年的时间里,百度基于该…

ArcGIS及其组件抛出 -- “Sorry, this application cannot run under a Virtual Machine.“

产生背景: 使用的是“破解版本”或“被套壳过”的非官方 ArcGIS 版本 破解版本作者为了防止: 被研究破解方式 被自动化抓包/提权/逆向 被企业环境中部署多机使用 通常会加入**“虚拟化环境检测阻断运行”机制** 原因解释: 说明你当前运…

进阶篇 第 5 篇:现代预测方法 - Prophet 与机器学习特征工程

进阶篇 第 5 篇:现代预测方法 - Prophet 与机器学习特征工程 (图片来源: ThisIsEngineering RAEng on Pexels) 在前几篇中,我们深入研究了经典的时间序列统计模型,如 ETS 和强大的 SARIMA 家族。它们在理论上成熟且应用广泛,但有…

影刀填写输入框(web) 时出错: Can not convert Array to String

环境: 影刀5.26.24 Win10专业版 问题描述: [错误来源]行12: 填写输入框(web) 执行 填写输入框(web) 时出错: Can not convert Array to String. 解决方案: 1. 检查变量内容 在填写输入框之前,打印BT和NR变量的值&#xff…

词语关系图谱模型

参数配置说明 sentences, # 分词后的语料(列表嵌套列表) vector_size100, # 每个词的向量维度 window5, # 词与上下文之间的最大距离(滑动窗口大小) min_count5, # 忽略出现次数小于5的…

HTTP的请求消息Request和响应消息Response

一:介绍 (1)定义 service方法里的两个参数 (2)过程 Request:获取请求数据 浏览器发送http请求数据(字符串),字符串被tomcat解析,解析后tomcat会将请求数据放入request对象 Response:…

C++异步操作 - future async package_task promise

异步 异步编程是一种程序设计范式,​​允许任务在等待耗时操作(如I/O、网络请求)时暂停执行,转而处理其他任务,待操作完成后自动恢复​​。其核心目标是​​避免阻塞主线程​​,提升程序的并发性和响应速度…

数据结构——栈以及相应的操作

栈(Stack) 在维基百科中是这样定义的: 堆栈(stack) 又称为栈或堆叠,是计算机科学中的一种抽象资料类型,只允许在有序的线性资料集合中的一端(称为堆栈顶端,top)进行加入数据(push)和…

如何应对政策变化导致的项目风险

应对政策变化导致的项目风险,核心在于:加强政策研判机制、建立动态应对流程、构建合规应急预案、强化跨部门联动、提升项目柔性与调整能力。其中,加强政策研判机制 是所有防范工作中的“前哨哨兵”,可以让项目团队在政策风向转变之…

ASP.Net Web Api如何更改URL

1.找到appsettings.json 修改如下: 主要为urls的修改填本机私有地址即可 {"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": &q…

【HTTPS协议原理】数据加密、如何防止中间人攻击、证书和签名、HTTPS完整工作流程

⭐️个人主页:小羊 ⭐️所属专栏:Linux网络 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 数据加密常见的加密方式数据摘要方案一:仅使用对称加密方案二:仅使用非对称加密方案三:双…

Java中链表的深入了解及实现

一、链表 1.链表的概念 1.1链表是⼀种物理存储结构上⾮连续存储结构,数据元素的逻辑顺序是通过链表中的引⽤链接次序实现的 实际中链表的结构⾮常多样,以下情况组合起来就有8种链表结构: 2.链表的实现 1.⽆头单向⾮循环链表实现 链表中的…

植物大战僵尸杂交版v3.6最新版本(附下载链接)

B站游戏作者潜艇伟伟迷于4月19日更新了植物大战僵尸杂交版3.6版本!!!,有b站账户的记得要给作者三连关注一下呀! 不多废话下载链接放上: 夸克网盘链接::https://pan.quark.cn/s/1af9b…

【源码】【Java并发】【ThreadLocal】适合中学者体质的ThreadLocal源码阅读

👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 👍 欢迎点赞、收藏、关注,跟上我的更新节奏 📚欢迎订阅专栏…

背包问题模板

文章目录 01背包题意思路代码优化 完全背包题意思路代码优化 多重背包题意思路代码优化 分组背包题意思路代码 01背包 特点:每件物品最多只能用一次 01背包问题 题意 给出每件物品的体积v,价值w,求解能装入背包的的物品的最大价值,并且每件物品只能选一…

Sentinel源码—8.限流算法和设计模式总结二

大纲 1.关于限流的概述 2.高并发下的四大限流算法原理及实现 3.Sentinel使用的设计模式总结 3.Sentinel使用的设计模式总结 (1)责任链模式 (2)监听器模式 (3)适配器模式 (4)模版方法模式 (5)策略模式 (6)观察者模式 (1)责任链模式 一.责任链接口ProcessorSlot 二.责…

VulnHub-DarkHole_1靶机渗透教程

VulnHub-DarkHole_1靶机渗透教程 1.靶机部署 [Onepanda] Mik1ysomething 靶机下载:https://download.vulnhub.com/darkhole/DarkHole.zip 直接使用VMware打开就行 导入成功,打开虚拟机,到此虚拟机部署完成! 注意&#xff1a…

边缘计算全透视:架构、应用与未来图景

边缘计算全透视:架构、应用与未来图景 一、产生背景二、本质三、特点(一)位置靠近数据源(二)分布式架构(三)实时性要求高 四、关键技术(一)硬件技术(二&#…

MQ底层原理

RabbitMQ 概述 RabbitMQ 是⼀个开源的⾼性能、可扩展、消息中间件(Message Broker),实现了 Advanced Message Queuing Protocol(AMQP)协议,可以帮助不同应⽤程序之间进⾏通信和数据交换。RabbitMQ 是由 E…