首页 > 编程语言 >读书记录--GO语言高级编程

读书记录--GO语言高级编程

时间:2025-01-12 21:01:50浏览次数:1  
标签:singleton 函数 -- 编程 切片 instance 线程 func GO

20240220

问题

记录

  • 如果某个包被多次导入的话,在执行的时候只会导入一次。当一个包被导入时,如果它还导入了其它的包,则先将其它的包包含进来,然后创建和初始化这个包的常量和变量,再调用包里的init函数,如果一个包有多个init函数的话,调用顺序未定义(实现可能是以文件名的顺序调用),同一个文件内的多个init则是以出现的顺序依次调用(init不是普通函数,可以定义有多个,所以也不能被其它函数调用)
  • 要注意的是,在main.main函数执行之前所有代码都运行在同一个goroutine,也就是程序的主系统线程中。因此,如果某个init函数内部用go关键字启动了新的goroutine的话,新的goroutine只有在进入main.main函数之后才可能被执行到。
  • Go语言中的函数可以有多个参数和多个返回值,参数和返回值都是以传值的方式和被调用者交换数据。在语法上,函数还支持可变数量的参数,可变数量的参数必须是最后出现的参数,可变数量的参数其实是一个切片类型的参数。
  • 及时赋值中间变量
- func main() {
    for i := 0; i < 3; i++ {
        i := i // 定义一个循环体内局部变量i
        defer func(){ println(i) } ()
    }
}

func main() {
    for i := 0; i < 3; i++ {
        // 通过函数传入i
        // defer 语句会马上对调用参数求值
        defer func(i int){ println(i) } (i)
    }
}
  • 因为切片中的底层数组部分是通过隐式指针传递(指针本身依然是传值的,但是指针指向的却是同一份的数据),所以被调用函数是可以通过指针修改掉调用参数切片中的数据。除了数据之外,切片结构还包含了切片长度和切片容量信息,这2个信息也是传值的。如果被调用函数中修改了LenCap信息的话,就无法反映到调用参数的切片中,这时候我们一般会通过返回修改后的切片来更新之前的切片。这也是为何内置的append必须要返回一个切片的原因。

总结

20240221

问题

Csp, Actor 不都是通过消息传递吗有什么区别

Csp 的 channel 规定了传输的类型,如果希望传输多个类型的数据,还需要创建多个 channel。既细化了传输内容,也增加了复杂度。
Actor 希望解决的问题范围更广?万物皆是 actor?
关于并发模型 Actor 和 CSP - 割肉机 - 博客园 (cnblogs.com)

记录

  • 通过接口的引入其他方法,从而实现接口工厂
  • 并发模型; shared memory, csp, Actor

总结

20240225

记录

  • buffers与cached不同:Buffers是存储在页缓存下的数据的磁盘块表示形式,Buffers包含驻留在页缓存(Page Cache)下的文件/数据的元数据(metadata),通常指的是目录项(dentries)和索引节点(inode)。而cached是用来给文件/数据做缓冲。更通俗一点说,cached里面存储的是数据,buffers里面存储的是数据在磁盘块表示形式。
  • 查看cached和buffers大小:通过cat /proc/meminfo命令可以查看cached和buffers的大小,

问题

如果缓存会自动释放,为什么之前写缓冲区不会自己释放?

系统的会自己释放,如果是自己创建的缓冲区,需要自己管理,所以不会自己释放。如果启动了某个进程,且从进程获取返回值,应该注意该进程的返回值问题。

如果A进程先把数据写入BUFFER,此时宕机了,BUFFER还存在吗,数据会丢失吗

梳理

20240226

记录

首先,每个系统级线程都会有一个固定大小的栈(一般默认可能是2MB),这个栈主要用来保存函数递归调用时参数和局部变量。固定了栈的大小导致了两个问题:一是对于很多只需要很小的栈空间的线程来说是一个巨大的浪费,二是对于少数需要巨大栈空间的线程来说又面临栈溢出的风险。针对这两个问题的解决方案是:要么降低固定的栈大小,提升空间的利用率;要么增大栈的大小以允许更深的函数递归调用,但这两者是没法同时兼得的。相反,一个Goroutine会以一个很小的栈启动(可能是2KB或4KB),当遇到深度递归导致当前栈空间不足时,Goroutine会根据需要动态地伸缩栈的大小(主流实现中栈的最大值可达到1GB)。因为启动的代价很小,所以我们可以轻易地启动成千上万个Goroutine。

问题

线程和协程的区别

  • 初始值大小
  • 伸缩性
  • 线程是内核调度的最小单位,协程是编程者控制的
  • 切换时会保存寄存器上下文和栈
  • 协程是非抢占式的,由编程者调度。线程是抢占 CPU 的。

总结

2024-02-27

记录

  • sync/atomic提供更細类型的原子操作,例如atomic.AddUint64(&total, i)
  • 原子操作配合互斥锁可以实现非常高效的单件模式。互斥锁的代价比普通整数的原子读写高很多,在性能敏感的地方可以增加一个数字型的标志位,通过原子检测标志位状态降低互斥锁的使用次数来提高性能。
  • 通过 sync/once + lock 可以一定程度解决高并发下的性能
type singleton struct {}

var (
    instance    *singleton
    initialized uint32
    mu          sync.Mutex
)

func Instance() *singleton {
    if atomic.LoadUint32(&initialized) == 1 {
        return instance
    }

    mu.Lock()
    defer mu.Unlock()

    if instance == nil {
        defer atomic.StoreUint32(&initialized, 1)
        instance = &singleton{}
    }
    return instance
}
var (
    instance *singleton
    once     sync.Once
)

func Instance() *singleton {
    once.Do(func() {
        instance = &singleton{}
    })
    return instance
}

问题

总结

标签:singleton,函数,--,编程,切片,instance,线程,func,GO
From: https://www.cnblogs.com/l402072123/p/18667301

相关文章

  • 读书记录--架构
    2024-12-31记录架构师成长第一步:如何做需求分析(方法经验总结,纯干货系列)-云飞龙行2021-博客园(cnblogs.com)1:理解业务,要准确、全面、深入这是需求分析阶段最最重要的工作。准确的意思就是:对每个功能点的理解,要没有歧义,不可再分。如果一个功能点,不同的人有不......
  • 音视频:JavaCV 采集桌面画面并显示的方法
    需要进行简单的音视频编程,如果不是特别熟悉C/C++,那么JavaCV应该是比较好的选择,下面记录一下使用JavaCV采集桌面数据的方法。使用FFmpegFrameGrabber采集桌面数据,指定输入源为desktop,format设置为gdigrab。参考雷神的博客:https://blog.csdn.net/leixiaohua1020/article/details/......
  • Formality:官方Tutorial(二)
    相关阅读Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm=1001.2014.3001.5482https://blog.csdn.net/weixin_45791458/category_12841971.html?spm=1001.2014.3001.5482        本文是对SynopsysFormalityUserGuideTutorial中第二......
  • libmodbus从机回应
    文章目录一、modbus_mapping_new_start_address函数**函数原型****参数说明****功能描述****工作原理****返回结构体:`modbus_mapping_t`****示例代码****错误处理****总结**二、modbus_reply函数**函数原型****参数说明****功能描述****错误处理****返回值****Modbus......
  • JAVA开源免费项目 基于Vue和SpringBoot的物资管理系统(附源码)
    本文项目编号T112,文末自助获取源码\color{red}{T112,文末自助获取源码}......
  • 毛玻璃导航源码(重制版)
    毛玻璃导航源码介绍博客目录前言效果图部分代码领取代码写代码经历总结前言在现代网页设计中,毛玻璃效果越来越受到欢迎。它不仅能提升页面的美观性,还有助于提升用户体验。本文将为大家介绍一个简单易用的毛玻璃导航源码,帮助你在项目中实现这一效果。效果图说明图......
  • JAVA开源免费项目 基于Vue和SpringBoot的学生网上请假系统(附源码)
    本文项目编号T111,文末自助获取源码\color{red}{T111,文末自助获取源码}......
  • Web前端------HTML块级和行内标签之行内标签
    一.行内标签介绍 行内标签----span      作用:        1.作为文本字体的容器,用来结合CSS修饰文本样式        2.根据行内标签的特性(不换行/部分块级样式不生效eg:宽高等等),做微小布局二.代码展示<!DOCTYPEhtml><htmllang=......
  • Python AI教程之十八:监督学习之决策树(9) 决策树模型中的过度拟合
    决策树模型中的过度拟合在机器学习中,决策树是一种常用的预测工具。然而,使用这些模型时遇到的一个常见问题是过度拟合。在这里,我们探讨决策树中的过度拟合以及应对这一挑战的方法。决策树为什么会出现过度拟合?决策树模型中的过度拟合是指决策树变得过于复杂,并捕获训练数......
  • 代码随想录:完全二叉树的节点个数
    拿到一个节点,先判断是不是等边三角形,若是直接返回2^n-1,位运算写在专题中/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*......