不会有人还以为程序运行的入门是main 函数吧。其实很多语言在main函数之前就已经做过很多事情了,下面咋们就分析分析go中的入门到执行的整个过程吧~~~
实际上是runtime/rt0_xxx.s
这个文件中, 有关runtime的叙述在上一节已经加以说明
比如在windows 平台上就是在runtime包中rt0_windows_amd64.s
这个汇编文件中,至于为什么编写成汇编语言,那肯定的汇编语言效率高呀~
这个的命令就是对应不同平台的,amd64 、386、arm实际上就是对应不同的芯片架构,amd64机器和inter64位机器都用一个文件,这里都是64位机器(业界习惯将x86-64架构说成amd64)
我这里使用的IDE 是Goland,查看源码非常方便
比如我需要找rt0_amd64 有关的文件,因为是汇编文件,需要点击里面的Files, 这个窗口需要双击shitf 出来
之后跳转到这个汇编函数中,这里的意思就是将argc, argv 变量放入到寄存器中
然后就跳转到rt0_go
这个函数中,这个比较核心了
runtime.main
(这个是runtime中
的main
,和用户写的main
函数不是同一个)type People struct {
name string
age int
}
type Man struct {
People
}
type People struct {
name string
age int
}
type Man struct {
People
}
func (p People) walk() {
}
func main() {
m := Man{}
m.walk() // 这其实是一个语法糖, 真正底层是 通过下面的方式实现的
m.People.walk()
fmt.Println("nihao")
}
在 People 结构体实现函数的一瞬间,编译器就能提示哪些类实现了接口,该类中实现了哪些接口
int: 大小跟随着系统字长(因此才有int32, int64这类型出来)
package main
import (
"fmt"
"unsafe"
)
func main() {
fmt.Println(unsafe.Sizeof(int(1)))
}
// int 64位系统占8字节,32位系统占4字节 根据系统字长决定,
// int64 永远占8字节
指针: 指针的大小也是随着系统字长决定
在64位系统中,是地址总线和数据总线是64位
package main
import (
"fmt"
"unsafe"
)
func main() {
i := int(0)
p := &i
fmt.Println(unsafe.Sizeof(p))
}
其他基本类型也可以按照上面查询占用的字节数
package main
import (
"fmt"
"unsafe"
)
type K struct {
}
func main() {
a := K{}
fmt.Println(unsafe.Sizeof(a))
fmt.Printf("%p\n", &a) // 有地址没有长度
// 0
// 0xebc578 : 这是一个空结构体指向的地址,后面你会发现这个是固定的
}
package main
import (
"fmt"
"unsafe"
)
type K struct {
}
func main() {
a := K{}
b := int(0)
c := K{}
fmt.Println(unsafe.Sizeof(a))
fmt.Printf("%p\n", &a) // 有地址没有长度
fmt.Printf("%p\n", &b)
fmt.Printf("%p\n", &c)
//0
//0xbdc578
//0xc00000a0c0
//0xbdc578
}
package main
import (
"fmt"
)
type K struct {
}
type F struct {
num1 K
num2 int32
}
func main() {
f := F{}
a := K{}
//fmt.Println(unsafe.Sizeof())
fmt.Printf("%p\n", &f.num1)
fmt.Printf("%p\n", &f.num2)
fmt.Printf("%p\n", &a)
}
// 0xc00000a0c0
// 0xc00000a0c0
// 0x28c578
func main() {
m := map[string]int{}
n := map[string]struct{}{} // hashset // key : null
n["a"] = struct{}{} // 值不占任何空间
}
func main() {
a := make(chan struct{}) // 只想发送信号,不想携带任何信息,这样就不占任何内存
}
参考:
后台服务器:https://course.0voice.com/v1/course/intro?courseId=5&agentId=0