首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏贾维斯Echo的博客

    Go介绍与初始化:搞清Go程序的执行次序

    Go介绍与初始化:搞清Go程序的执行次序 一、main.main 函数:Go 应用的入口函数 1.1 main.main 函数 在Go语言中,main函数是任何Go应用的入口函数--用户层入口。 我们看到,在初始化 Go 时,Go 会按照一定的次序,逐一、顺序地调用这个的 init 函数。 六、Go 初始化次序 6.1 初始化次序探究 我们从程序逻辑结构角度来看,Go 是程序逻辑封装的基本单元,每个都可以理解为是一个“自治”的、封装良好的、对外部暴露有限接口的基本单元。 下面,我们就通过一张流程图,来了解 Go 初始化次序: 这里,我们来看看具体的初始化步骤。 此外,main 的两个 init 函数,会按照在源文件 main.go 中的出现次序进行调用。根据 Go 语言规范,一个被多个依赖的仅会初始化一次,因此这里的 pkg3 仅会被初始化了一次。

    1K40编辑于 2023-10-23
  • 来自专栏陶士涵的菜地

    Go语言圣经--和文件-初始化习题

    1.解决级变量的依赖顺序,然后按照级变量声明出现的顺序依次初始化 2.中含有多个.go源文件,它们将按照发给编译器的顺序进行初始化 3.init初始化函数,在每个文件中的init初始化函数,在程序开始执行时按照它们声明的顺序被自动调用 4.每个包在解决依赖的前提下,以导入声明的顺序初始化,每个只会被初始化一次,在main函数执行之前,所有依赖的都已经完成初始化工作了 5.一个数字中含二进制1bit的个数算法,统计出一个int型数值中比特值为 import( "fmt" ) var pc [256]byte func init() { for i := range pc { pc[i] = pc[i/2] //x & (x-1)算法 func PopCount2(x uint64) int{ num := 0 for x! uint64) int { return int(pc[byte(x>>(0*8))] + pc[byte(x>>(1*8))] + pc[byte(x>>(2*

    65330发布于 2019-09-10
  • 来自专栏六月-游戏开发

    c++中类的数据成员初始化次序

    根据老师的讲解,数据成员的初始化次序依次为: 就地初始化 > 构造函数的初始化列表 >构造函数里的赋值(严格意义上不能成为初始化) 而当三种初始化方式都有时,构造函的函数体里的赋值肯定执行,并且生效 ,但是就地初始化和构造函数初始化列表的执行情况是怎样呢? STU s1{}; //调用无参构造 cout << "n = " << n << ",id = " << s1.getId()<< endl; STU s<em>2</em>{ 10}; cout << "n = " << n << ",id = " << s<em>2</em>.getId()<< endl; return 0; } 运行结果为: 0 n = 1,id 所以当一个数据成员同时拥有就地<em>初始化</em>和<em>初始化</em>列表时,它会忽略就地<em>初始化</em>而执行构造函数<em>初始化</em>列表。

    1.4K20编辑于 2022-12-26
  • 来自专栏学而时习之

    go源码剖析2 内存分配2 初始化

    初始化时的虚拟地址空间: 因为内存分期和垃圾回收算法都依赖要连续的地址, 所以在初始化阶段, 预先保留了很大的一段虚拟地址空间. 保留地址空间, 并不会分配内存.

    51240发布于 2020-05-19
  • 来自专栏繁依Fanyi 的专栏

    Go 基础篇】Go语言 init函数详解:初始化与应用

    介绍 在Go语言中,init() 函数是一种特殊的函数,用于在包被导入时执行一次性的初始化操作。init() 函数不需要手动调用,而是在包被导入时自动执行。 init() 函数的基本概念 作用与调用时机 init() 函数是一种在Go语言中用于执行初始化操作的特殊函数。每个可以包含多个 init() 函数,它们会在包被导入时按照顺序自动执行。 (plugins, func() { // 注册插件1的功能 }) plugins = append(plugins, func() { // 注册插件2的功能 总结 init() 函数是Go语言中一种特殊的函数,用于在包被导入时执行一次性的初始化操作。它的作用范围广泛,可以用于初始化配置信息、建立数据库连接、注册功能插件等。 通过在 init() 函数中进行一次性的初始化,可以保证在整个程序生命周期中只有一个实例被创建。 总之,init() 函数是Go语言中用于初始化操作的重要工具。

    2.9K10编辑于 2023-10-12
  • 来自专栏大猪的笔记

    go web: 2 封装日志log

    所以,我做的第一件事,就是向log动手。 和Python相比,log功能上逊色不少,但它给我们提供了基础的构架,让我们能自己稍微封装下。 需求 对日志我的要求很低,只要满足: 1. 提供Error, Info方法即可 2. logger.go | main.go 这个文件代码有点长,所以放附录了。 附录logger.go代码 // Package logger 是系统日志的封装,主要在之上封装了Error,Info两个函数。并提供了跨日期 // 自动分割日志文件的功能。 var logging *Logger var DEBUG = 0 var INFO = 3 var ERROR = 5 //InitLogging 初始化默认的日志对象,初始化后,就能使用Error

    1.9K10发布于 2019-11-21
  • 来自专栏乐沙弥的世界

    PLSQL --> 重载、初始化

    --========================== -- PL/SQL --> 重载、初始化 --========================== 的重载功能类似于C++中函数的重载功能 (7788); scott@ORCL> print sal_1 sal_2; SAL_1 ---------- 5800 SAL_2 ---------- 3900 四、初始化 初始化,也称之为的构造过程。 对于初始化,其通常的办法是体的末尾增加一段匿名SQL代码。 PL/SQL --> 重载、初始化 PL/SQL --> DBMS_DDL的使用 PL/SQL --> DML 触发器 PL/SQL --> INSTEAD OF 触发器

    93320发布于 2018-08-07
  • 来自专栏solate 杂货铺

    go unsafe

    go unsafe unsafe是不安全的,可以绕过go内存安全机制,直接对内存进行读写。 指针转换 go 语言是强类型的,所以一般情况不允许不同类型指针进行转换 func main() { i:= 10 ip:=&i var fp *float64 = (*float64)(ip) It represents the type of an arbitrary Go expression. type ArbitraryType int type Pointer *ArbitraryType 中,是一种类型 // uintptr is an integer type that is large enough to hold the bit pattern of // any pointer 指针运算的核心在于它操作的是一个个内存地址,通过内存地址的增减,就可以指向一块块不同的内存并对其进行操作,而且不必知道这块内存被起了什么名字(变量名) 指针转换规则 Go 语言中存在三种类型的指针: 常用的

    75010编辑于 2022-05-09
  • 来自专栏TomatoCool

    go runtime

    Gosched()函数用于让出 CPU 时间,让其他 goroutine拥有运行的机会。其原理是将当前goroutine放回到队列中,等待下一次调度。

    31430编辑于 2023-09-13
  • 来自专栏python-爬虫

    Go-

    Go- 的介绍以及使用 为什么使用 为了更加好的维护代码 的位置 必须再GOPATH路径的src中 能导入的内容 导入的内容名称必须是大写字母开头不然无法导入 src中的一个文件夹为一个 内的变量以及函数名 在同一文件夹下,就相当于同一中,任何变量名不能进行二次定义 在同一中,可以互相使用其他GO文件下的函数且不需要导入 go 程序中必须有一个main和一个main入口 如果不是package main他就是一个,他会把里面的函数都进行保存,不能有main函数 main也是一个特殊的,其中必须要有main函数,作为程序的入口,也就是执行这个文件的时候其中就是运行main函数 导入第三方模块 语法:go get 第三方模块路径 文件会被安装在GOPATH路径的src文件夹下

    35030发布于 2020-06-19
  • 来自专栏代码世界

    go-

    举个例子, 我们定义一个名为pkg2,代码如下: package pkg2 import "fmt" // 变量可见性 var a = 100 // 首字母小写,外部不可见,只能在当前内使用 单行导入 单行导入的格式如下: import "1" import "2" 多行导入 多行导入的格式如下: import ( "1" "2" ) 自定义名 在导入名的时候,我们还可以为导入的设置别名 init()初始化函数 init()函数介绍 在Go语言程序执行时导入语句会自动触发包内部 init() 函数的调用。需要注意的是:  init() 函数没有参数也没有返回值。   初始化执行的顺序如下图所示: ? init()函数执行顺序 Go语言会从 main 开始检查其导入的所有,每个中又可能导入了其他的Go编译器由此构建出一个树状的引用关系,再根据引用顺序决定编译顺序,依次编译这些的代码。 在运行时,被最后导入的会最先初始化并调用其 init() 函数, 如下图示: ?

    62610发布于 2020-03-11
  • 来自专栏白杨的学习笔记

    白杨的Go语言入门课程(2)使用别人的

    使用三方提供的我们在pkg.go.dev这个网站上查找需要的,将一下代码写道hello.gopackage mainimport "fmt"import "rsc.io/quote"func main () { fmt.Println(quote.Go())}执行 go mod tidy将依赖导入D:\go\hello>go mod tidygo: finding module for package rsc.io/quotego: found rsc.io/quote in rsc.io/quote v1.5.2执行D:\go\hello>go run .Don't communicate by

    15520编辑于 2023-09-04
  • 来自专栏大愚Talk

    Go初始化变量的招式

    2018年伊始,开始从PHP转到Go的开发方向,虽然说学习路线并不是非常陡峭,但是过程中遇到不少坑以及有意思的地方,忍不住想总结分享给大家。今天先来聊一聊Go初始化变量的几种方式。 Go初始化值类型的招式 Golang的数据类型可以分为:值类型 与 引用类型,我先来总结一下Go中值类型(以 string 为例)的初始化方式: var a1 string fmt.Printf("a1 : %#v \n", a1) // a1: "" var a2 *string fmt.Printf("a2: %#v \n", a2) // a2: (*string)(nil) // panic: Go初始化引用类型的招式 这是我想说的重点,Go中的引用类型仅有三种:::map:: ::slice:: ::channel::,这里举例就用slice来进行。 在Go中绝对不会采用这种方式来初始化 ::slice:: 的,原因是为什么呢?

    1K40发布于 2019-01-07
  • 来自专栏学而时习之

    go源码剖析1 初始化

    前言 实际上, 编译好的二进制文件的执行入口并非我们所写的main.main函数, 因为编译器会插入一段引导代码,用来完成准备操作,eg命令行参数 运行时初始化等 命令行 go build -gcflags "-N -l" -o xxx xxx.go 编译后使用gdb查看发现在创建main goroutine之前会调用初始化函数 runtime.args() runtime.osinit() runtime.schedinit 1.线程的最大数量限制; 2.初始化栈 内存分配器 调度器; 3. 处理命令行参数和环境变量; 4. 垃圾回收器初始化; 5.通过cpu core和gomaxprocs环境变量确定p的数量; 6. 调整p的数量 procl.go func schedinit() { // 设置了线程的最大数量限制 sched.maxmcount = 10000 // 栈初始化 tracebackinit 所有init都在同一个goroutine内执行 2. 所有init函数结束后才会执行main.main函数 3. 强烈建议init只做该做的事情: 局部初始化

    52660发布于 2020-05-15
  • 来自专栏python-爬虫

    Go-闭

    一.关于闭的定义 定义在函数内部 对外部作用域有引用 二.GO语言里的闭 原来和其他语言一模一样,作用域的影响函数内只受函数内的影响 三.重点(不同于其他语言) GO语言中的函数套函数内层函数必须是匿名函数 另外关于函数套函数返回值怎么写 func test2(y int)(func(x int)func(),int) { a :=func(x int)func() { return func() return a,5 } //就是本质一样的什么样子返回,什么样子接受 四.补充取别名 //type 别名 被定义别名的 type my_func func(x int)func() func test2(

    43820发布于 2020-06-19
  • 来自专栏ReganYue's Blog

    Go】闭函数

    改进前程序 package main import "fmt" func main() { var p2,progress int //获得武松和鲁达各自的“闭内层函数” //闭的作用是保存 “各自的内层函数状态” f1 := GetDoTaskFunc() f2 := GetDoTaskFunc() //交错的执行任务 progress = f1("武松",13) p2 = f2 ("鲁达",12) progress = f1("武松",13) p2 = f2("鲁达",13) progress = f1("武松",1) p2 = f2("鲁达",13) //查看各自的状态 //各自的任务被保存在各自的闭中 fmt.Print("鲁达的进度说:",p2) fmt.Println("二哥的进度是",progress) //f1 := GetDoTaskFunc := GetTaskFunc("李逵") p1 := tf1(13) p2 := tf2(14) p1 = tf1(10) p2 = tf2(18) fmt.Println("武松的进度:"

    46320发布于 2021-09-16
  • 来自专栏程序员奇点

    Go Log使用

    Go Log使用 log定义了Logger类型,该类型提供了一些格式化输出的方法。 本也提供了一个预定义的“标准”logger,可以通过调用函数Print系列(Print|Printf|Println)、Fatal系列(Fatal|Fatalf|Fatalln)、和Panic系列(Panic } 运行结果 2021/03/03 15:05:25.961952 D:/GoProject/src/main/gobase/log/logger1.go:7: 这是一条很普通的日志。 } 运行结果 <New>2017/06/19 14:06:51 main.go:34: 这是自定义的logger记录的日志。 /log_demo/main.go:13: 这是一条很普通的日志 这样我们就能够在代码中为我们的日志信息添加指定的前缀,方便之后对日志信息进行检索和处理

    77320发布于 2021-03-11
  • 来自专栏猫头虎博客专区

    2015年2月4日 Go生态洞察:Go语言中的命名艺术

    2015年2月4日 Go生态洞察:Go语言中的命名艺术 摘要 大家好,我是猫头虎,今天我们来探讨Go语言中一个非常重要但经常被忽视的话题:命名。 一个好的名不仅能够让代码更加易懂,还能够帮助开发者明确的功能和范围。让我们深入了解如何为Go选择合适的名字吧! 引言 在Go语言中,代码是组织成的。 一个好的名能为中的内容提供清晰的上下文,帮助使用者理解包的用途,并简化维护工作。本文将详细探讨如何为Go命名,以及如何避免常见的命名陷阱。 正文 命名的重要性 名是Go程序中的关键部分,良好的命名有助于客户端理解和使用。 分解通用 将通用拆分成更具体的。 避免不必要的名冲突 尽量避免使用与频繁一起使用的其他名相同的名。 总结 在Go语言中,命名是代码组织的核心。

    25710编辑于 2024-04-09
  • 来自专栏go语言核心编程技术

    Go语言goroutine调度器初始化

    本文是《Go语言调度器源代码情景分析》系列的第12篇,也是第二章的第2小节。 rt0_go函数完成了go程序启动时的所有初始化工作,因此这个函数比较长,也比较繁杂,但这里我们只关注与调度器相关的一些初始化,下面我们分段来看: runtime/asm_amd64.s : 87 TEXT MOVQSI, BX// BX = argv SUBQ$(4*8+7), SP// 2args 2auto ANDQ$~15, SP //调整栈顶寄存器使其按16字节对齐 ,对m0初始化完成之后调用procresize初始化系统需要用到的p结构体对象,按照go语言官方的说法,p就是processor的意思,它的数量决定了最多可以有都少个goroutine同时并行运行。 ,所以这个函数的处理比较复杂,但如果只考虑初始化,相对来说要简单很多,所以这里只保留了初始化时会执行的代码: runtime/proc.go : 3902 func procresize(nprocs

    1.5K30发布于 2019-06-24
  • 来自专栏码农桃花源

    开天辟地 —— Go scheduler 初始化(二)

    上一讲我们说完了 GPM 结构体,这一讲,我们来研究 Go sheduler 结构体,以及整个调度器的初始化过程。 在 proc.go 和 runtime2.go 文件中,有一些很重要全局的变量,我们先列出来: // 所有 g 的长度 allglen uintptr // 保存所有的 g allgs 我们从一个 HelloWorld 的例子来回顾一下 Go 程序初始化的过程: package main import "fmt" func main() { fmt.Println("hello SB),完成 go 启动时所有的初始化工作。 调整 SP 第一段代码,将 SP 调整到了一个地址是 16 的倍数的位置: SUBQ $(4*8+7), SP // 2args 2auto // 调整栈顶寄存器使其按 16 个字节对齐

    1K20发布于 2019-09-04
领券