go学习笔记:测试题-答案
package main
import (
"fmt"
"math"
"sync"
"sync/atomic"
"time"
)
指针
题目 :编写一个Go程序,定义一个函数,该函数接收一个整数指针作为参数,在函数内部将该指针指向的值增加10,
然后在主函数中调用该函数并输出修改后的值。
func PointerFunc(p *int) {
*p += 10
}
题目 :实现一个函数,接收一个整数切片的指针,将切片中的每个元素乘以2。
func SliceFunc(p *[]int) {
for i := 0; i < len(*p); i++ {
(*p)[i] *= 2
}
}
Goroutine
题目 :编写一个程序,使用 go 关键字启动两个协程,一个协程打印从1到10的奇数,另一个协程打印从2到10的偶数。
// 打印奇数
func printOdd() {
for i := 1; i <= 10; i += 2 {
fmt.Println("奇数:", i)
}
}
// 打印偶数
func printEven() {
for i := 2; i <= 10; i += 2 {
fmt.Println("偶数:", i)
}
}
题目 :设计一个任务调度器,接收一组任务(可以用函数表示),并使用协程并发执行这些任务,同时统计每个任务的执行时间。
// 定义任务类型
// 每个任务是一个无参无返回值的函数
type Task func()
// 任务调度器,接收任务列表并并发执行,统计每个任务的耗时
func RunTasks(tasks []Task) {
var wg sync.WaitGroup
for idx, task := range tasks {
wg.Add(1)
go func(i int, t Task) {
defer wg.Done()
start := time.Now()
t()
elapsed := time.Since(start)
fmt.Printf("任务%d 执行时间: %v\n", i+1, elapsed)
}(idx, task)
}
wg.Wait()
}
面向对象
题目 :定义一个 Shape 接口,包含 Area() 和 Perimeter() 两个方法。然后创建 Rectangle 和 Circle 结构体,实现 Shape 接口。在主函数中,创建这两个结构体的实例,并调用它们的 Area() 和 Perimeter() 方法。
// 定义 Shape 接口
type Shape interface {
Area() float64
Perimeter() float64
}
// 定义 Rectangle 结构体
type Rectangle struct {
Width, Height float64
}
// 实现 Shape 接口
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
// 周长
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}
// 定义 Circle 结构体
type Circle struct {
Radius float64
}
// 实现 Shape 接口,面积
func (c Circle) Area() float64 {
return math.Pi * c.Radius * c.Radius
}
// 周长
func (c Circle) Perimeter() float64 {
return 2 * math.Pi * c.Radius
}
题目 :使用组合的方式创建一个 Person 结构体,包含 Name 和 Age 字段,再创建一个 Employee 结构体,组合 Person 结构体并添加 EmployeeID 字段。为 Employee 结构体实现一个 PrintInfo() 方法,输出员工的信息。
// 定义 Person 结构体
type Person struct {
Name string
Age int
}
// 定义 Employee 结构体,组合 Person
type Employee struct {
Person // 匿名嵌入,实现组合
EmployeeID int
}
// 为 Employee 实现 PrintInfo 方法
func (e Employee) PrintInfo() {
fmt.Printf("姓名: %s, 年龄: %d, 工号: %d\n", e.Name, e.Age, e.EmployeeID)
}
Channel
题目 :编写一个程序,使用通道实现两个协程之间的通信。一个协程生成从1到10的整数,并将这些整数发送到通道中,另一个协程从通道中接收这些整数并打印出来。
func ChannelFunc(ch chan int) {
go func() {
for i := 1; i <= 10; i++ {
ch <- i
}
close(ch)
}()
for v := range ch {
fmt.Println(v)
}
}
题目 :实现一个带有缓冲的通道,生产者协程向通道中发送100个整数,消费者协程从通道中接收这些整数并打印。
锁机制
题目 :编写一个程序,使用 sync.Mutex 来保护一个共享的计数器。启动10个协程,每个协程对计数器进行1000次递增操作,最后输出计数器的值。
func MutexCounterDemo() {
var count int
var mu sync.Mutex
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for j := 0; j < 1000; j++ {
mu.Lock()
count++
mu.Unlock()
}
}()
}
wg.Wait()
fmt.Println("最终计数器的值:", count)
}
题目 :使用原子操作( sync/atomic 包)实现一个无锁的计数器。启动10个协程,每个协程对计数器进行1000次递增操作,最后输出计数器的值。
考察点 :原子操作、并发数据安全。
func AtomicCounterDemo() {
var count int32
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func() {
defer wg.Done()
for j := 0; j < 1000; j++ {
atomic.AddInt32(&count, 1)
}
}()
}
wg.Wait()
fmt.Println("最终计数器的值:", count)
}
func main() {
// 指针1
var v int = 9
var p1 *int = &v
PointerFunc(p1)
fmt.Println(*p1)
fmt.Println("=========")
// 指针2
SliceFunc(&[]int{1, 2, 3, 4, 5})
// Goroutine1
go printOdd()
go printEven()
time.Sleep(100 * time.Millisecond)
// Goroutine2
tasks := []Task{
func() {
time.Sleep(500 * time.Millisecond)
fmt.Println("任务1完成")
},
func() {
time.Sleep(300 * time.Millisecond)
fmt.Println("任务2完成")
},
func() {
time.Sleep(700 * time.Millisecond)
fmt.Println("任务3完成")
},
}
RunTasks(tasks)
//面向对象1
r := Rectangle{Width: 3, Height: 4}
c := Circle{Radius: 5}
fmt.Printf("矩形: 面积=%.2f, 周长=%.2f\n", r.Area(), r.Perimeter())
fmt.Printf("圆形: 面积=%.2f, 周长=%.2f\n", c.Area(), c.Perimeter())
// 面向对象2
e := Employee{
Person: Person{
Name: "张三",
Age: 28,
},
EmployeeID: 1001,
}
e.PrintInfo() // 输出:姓名: 张三, 年龄: 28, 工号: 1001
//Channel1
ch := make(chan int)
ChannelFunc(ch)
//Channel2
ch2 := make(chan int, 100)
ChannelFunc(ch2)
//锁机制1
MutexCounterDemo()
//锁机制2
AtomicCounterDemo()
}
go学习笔记:测试题-答案的更多相关文章
- 《C++Primer》第五版习题答案--第三章【学习笔记】
[C++Primer]第五版[学习笔记]习题解答第三章 ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/10 第三章:字符串,向量和数组 ...
- 《C++Primer》第五版习题答案--第五章【学习笔记】
<C++Primer>第五版习题答案--第五章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/15 第五章:语句 ...
- 《C++Primer》第五版习题答案--第六章【学习笔记】
<C++Primer>第五版习题答案--第六章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/16 第六章:函数 ...
- Sharepoint学习笔记—习题系列--70-576习题解析 --索引目录
Sharepoint学习笔记—习题系列--70-576习题解析 为便于查阅,这里整理并列出了70-576习题解析系列的所有问题,有些内容可能会在以后更新. 需要事先申明的是: 1. ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 【工作笔记】BAT批处理学习笔记与示例
BAT批处理学习笔记 一.批注里定义:批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD,这些命令统称批处理命令. 二.常见的批处理指令: 命令清单: 1.RE ...
- 驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址
驱动开发学习笔记. 0.07 Uboot链接地址 加载地址 和 链接脚本地址 最近重新看了乾龙_Heron的<ARM 上电启动及 Uboot 代码分析>(下简称<代码分析>) ...
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
- C#可扩展编程之MEF学习笔记(三):导出类的方法和属性
前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...
- SQLServer学习笔记系列4
一.写在前面的话 好多天没有记录sql学习笔记了,要坚持下去,坚信每一点的进步都是为在积蓄力量.今天看到一幅图,特此分享出来. 通过这幅图,我看到的是每人站在自己的角度看问题,感受是不一样的,就如同学 ...
随机推荐
- C++11 Lambda表达式(匿名函数)详解
使用STL时,往往会大量用到函数对象,为此要编写很多函数对象类.而有的函数对象类只用定义一个对象,而且这个对象也只使用一次,那编写这样一个函数对象就很浪费了.而且有时这定义函数对象类的地方和使用函数对 ...
- VMware NSX Manager SSL证书更新
安装 NSX 后,管理器节点和集群具有自签名证书.证书有效期为825天,到期后需要进行证书重新更新.如图所示,本环境中此次将有三个类型的证书即将到期需要替换:1.NSX 联合身份验证 PI(Local ...
- linux 的 Docker 配置(版本24.04)
linux 的docker配置(版本24.04) 这里默认是server版本的, 个人感觉好用,资源消耗少 1.配置ssh连接 个人习惯用ssh连接使用 (如果失败,先配置下一步的换源) sudo a ...
- React-Native开发鸿蒙NEXT-蓝牙与图片处理的更正补充
.markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...
- python3里面实现将日志文件写入当前脚本运行的文本中
在 Python3 中,可以使用 logging 模块来实现将日志写入本地文本文件中.下面是一个简单的示例代码: import logging # 配置 logging 模块 logging.basi ...
- Django Web应用开发实战第一章
一.常见域名后缀 .com:商业性的机构或公司. .net:从事Internet相关的网络服务的机构或公司. .org:非营利的组织.团体. .gov:政府部门. .cn:中国国内域名. .com.c ...
- FastAPI安全门神:OAuth2PasswordBearer的奇妙冒险
title: FastAPI安全门神:OAuth2PasswordBearer的奇妙冒险 date: 2025/05/30 18:34:14 updated: 2025/05/30 18:34:14 ...
- 【语义分割专栏】2:U-net原理篇(由浅入深)
目录 前言 背景介绍 U-net核心剖析 编码解码结构(U形状) 卷积模式 跳跃连接 add concat 其他细节 overlap-tile策略 弹性形变 U-net模型代码 结语 参考资料 前言 ...
- mysql安全小结
sql的注入是一个很困扰人的问题,一些恶意攻击者可以利用sql注入来获取甚至是修改数据库中的信息,尤其是一些比较敏感的密码一类的数据. sql注入主要利用mysql 的注释将后续应正常执行的语句注释掉 ...
- 安卓手机上部署nodejs服务器
一.准备软件 Termux 下载地址: 链接:https://pan.baidu.com/s/1J3OQITWc34uT-Mc8B-moPA?pwd=ug9j 提取码:ug9j KSW ...