【Golang 面试题】每日 3 题(二)

server/2024/12/27 4:40:40/

✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/UWz06
📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

4. Go 支持什么形式的类型转换?

  1. 数值类型之间的转换

Go 语言支持整型和浮点型之间的转换,但需要注意转换的精度问题。通常,将高精度的数据类型转换为低精度的数据类型会丢失精度。例如,将 float64 类型的浮点数转换为 float32 类型的浮点数,可能会导致数据精度的损失。

  1. 字符串和数值类型之间的转换

Go 语言支持字符串和数值类型之间的相互转换。可以使用 strconv 包中的函数将字
符串转换为数值类型,或将数值类型转换为字符串。例如,将字符串转换为整型:

go">str := "123"
i, err := strconv.Atoi(str)
if err != nil {// 转换失败
} else {// 转换成功,i为123
}
  1. 指针类型之间的转换

Go 语言中的指针类型可以互相转换,但需要注意指针指向的数据类型必须一致。例如,将一个 *int 类型的指针转换为 *uintptr 类型的指针:

go">var i int = 123
p := &i
uintptrPtr := (*uintptr)(unsafe.Pointer(p))

需要注意的是,指针类型之间的转换需要使用 unsafe 包中的函数,因此不太安全,应该尽量避免使用。

  1. 自定义类型之间的转换

Go 语言中支持自定义类型之间的相互转换,但需要注意自定义类型的底层类型必须相同。例如,定义两个自定义类型:

go">type Celsius float64
type Fahrenheit float64

可以通过定义函数实现自定义类型之间的转换:

go">func CToF(c Celsius) Fahrenheit {return Fahrenheit(c*9/5 + 32)
}

总之,Go 语言支持数值类型、字符串、指针类型和自定义类型之间的转换,但需要注意转换的精度和安全性问题。

5. 什么是 Goroutine?你如何停止它?

Goroutine 是 Go 语言中的一种轻量级线程,由 Go 运行时环境调度。与传统的线程相比,Goroutine 的创建和销毁代价非常低,可以创建成千上万个 Goroutine,而不会导致系统负担过重。Goroutine 可以通过 go 关键字启动,它会在一个独立的栈空间中执行相应的函数,可以在函数中执行阻塞和非阻塞操作。

要停止 Goroutine,需要使用 Go 语言提供的通道(channel)机制。可以在 Goroutine 中使用一个通道来接收停止信号,当主线程需要停止 Goroutine 时,向该通道发送一个信号即可。Goroutine 在执行任务的同时需要不断检测该通道是否有信号,如果有,则立即退出任务。

下面是一个简单的示例代码,演示了如何使用通道停止 Goroutine:

go">package mainimport ("fmt""time"
)func worker(stopCh chan bool) {for {select {case <-stopCh:fmt.Println("worker stopped")returndefault:fmt.Println("working...")time.Sleep(1 * time.Second)}}
}func main() {stopCh := make(chan bool)go worker(stopCh)time.Sleep(5 * time.Second)stopCh <- truetime.Sleep(1 * time.Second)fmt.Println("main stopped")
}

在上面的示例代码中,我们创建了一个名为 worker 的 Goroutine,它会在循环中不断执行任务。主线程会在启动 worker 后等待 5 秒钟,然后向 stopCh 通道发送一个停止信号,worker 接收到该信号后会立即退出任务。最后,主线程等待 1 秒钟后结束执行。

6. 如何在运行时检查变量类型?

在 Go 语言中,可以使用反射(reflection)机制来在运行时检查变量的类型。反射是一种在程序运行时检查变量类型、值的机制,可以在不知道具体类型的情况下操作对象。

Go 语言中的反射主要依赖于 reflect 包提供的函数和类型。通过 reflect 包中的 TypeOf 和 ValueOf 函数,可以获取一个变量的类型和值,从而进行相关操作。以下是一个简单的示例代码:

go">package mainimport ("fmt""reflect"
)func main() {var x interface{}x = 42t := reflect.TypeOf(x)v := reflect.ValueOf(x)fmt.Printf("Type: %v\n", t)fmt.Printf("Value: %v\n", v)
}

在上面的示例代码中,我们定义了一个接口变量 x,并将其赋值为 42。接着,使用 reflect.TypeOf 和 reflect.ValueOf 函数获取了变量 x 的类型和值,并分别打印输出。
需要注意的是,反射机制的使用可能会带来一定的性能损失,因此应该尽量避免过度使用反射。在编写代码时,应该尽可能地使用静态类型检查,避免在运行时进行类型检查和转换。


http://www.ppmy.cn/server/153526.html

相关文章

【LuaFramework】服务器模块相关知识

目录 一、客户端代码 二、本地服务器代码 三、解决服务器无法多次接收客户端消息问题 一、客户端代码 连接本地服务器127.0.0.1:2012端口&#xff08;如何创本地服务器&#xff0c;放最后说&#xff09;&#xff0c;连接成功后会回调 协议号Connect是101&#xff0c;其他如下…

【ES6复习笔记】rest参数(7)

什么是 rest 参数&#xff1f; rest 参数是 ES6 引入的一个特性&#xff0c;它允许我们将一个不定数量的参数表示为一个数组。使用 rest 参数可以更方便地处理函数的参数&#xff0c;尤其是在参数数量不确定的情况下。 如何使用 rest 参数&#xff1f; 在函数定义中&#xf…

Debezium日常分享系列之:Debezium Engine

Debezium日常分享系列之&#xff1a;Debezium Engine 依赖打包项目在代码中输出消息格式消息转换消息转换谓词高级记录使用引擎属性异步引擎属性数据库模式历史属性处理故障 Debezium连接器通常通过部署到Kafka Connect服务来运行&#xff0c;并配置一个或多个连接器来监视上游…

【项目介绍】基于机器学习的低空小、微无人机识别技术

文章目录 1.项目介绍2.数据预处理3.特征选取4.模型训练参考文献 1.项目介绍 对于现代雷达探测系统而言&#xff0c;无人机和飞鸟同属于低空小、微特征的一类典型目标&#xff0c;而面对比较复杂的环境&#xff0c;如何有效区分两者类型并完成识别是当下急迫且重要的难题。常规…

Docker部署GitLab服务器

一、GitLab介绍 1.1 GitLab简介 GitLab 是一款基于 Git 的开源代码托管平台&#xff0c;集成了版本控制、代码审查、问题跟踪、持续集成与持续交付&#xff08;CI/CD&#xff09;等多种功能&#xff0c;旨在为团队提供一站式的项目管理解决方案。借助 GitLab&#xff0c;开发…

2024.12.25在腾讯云服务器上使用docker部署flask

2024.12.25在腾讯云服务器上使用docker部署flask 操作系统&#xff1a;Ubuntu 根据腾讯云的说明文档安装 Docker 并配置镜像加速源&#xff0c;注意需要安装腾讯云的加速源&#xff0c;使用官网的加速源连接极其不稳定&#xff0c;容易导致运行失败。使用哪个公司的云服务器就…

MySQL for update skip locked 与 for update nowait

理论&#xff08;下方有实操&#xff09; for update skip locked 官方文档&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/innodb-locking-reads.html#innodb-locking-reads-for-update语法&#xff1a;select语句后跟 for update skip locked作用&#xff1a;目标对…

面试题整理(四)

1.Max transition,leakage优化,hold time ,setup time violation修复的顺序是? 答:先把max transition修复掉,如果max transition有violation,意味着其超出了查找表范围之外,所以计算得到的delay都不是很准的。 其次是把setup修复了,因为setup相对来说,需要减少cell…