我是Go的一年半的小白, 跟你总结 Go语言的核心知识基础

我是Go的一年半的小白, 跟你总结 Go语言的核心知识,基础

初学者入门Go语言 ,到底要学什么?

下面就是我2019年到现在学的东西,希望对你有用,快给我点赞

Go语言

Go语言的核心思想

并发

Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。

对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。

Go语言的线程模型:CSP线程模型

传统的线程模型

Go语言推荐的线程模型

Go条件语句select

CSP communicating sequential processes

Go的包

在 Go 中,如果一个名字以大写字母开头,那么它就是已导出的。例如,Pizza 就是个已导出名,Pi 也同样,它导出自 math 包。

pizza 和 pi 并未以大写字母开头,所以它们是未导出的。

在导入一个包时,你只能引用其中已导出的名字。任何“未导出”的名字在该包外均无法访问。就算是在一个已导出的类中定义的方法,如果是以小写字母开头,也是不能导出的。

Go的函数

函数外的每个语句都必须以关键字开始(var, func 等等),因此 := 结构不能在函数外使用。

Go的指针

go的指针用法和C语言基本相同,用&取地址、*解指针;指针和值修改的各种特性也和C语言相同。此处只介绍几个go语言独特的地方。

&Type{}new(Type)

下面这几个例子是等价的:

a:=&Type{
    
    }
func f()*int{
    
    
   i:=0
   return &i
}

a:=f()
a:=new(Type)
func f()*Type{
    
    
   a:=new(int)
   return a
}

a:=f()

看出来什么了吗?没错,在go语言里面a:=&Type{}a:=new(Type)都是分配堆空间,每次a:=&Type{}a:=new(Type)操作得到的都是不同的地址。比如调用上面两个f函数的任一个:

func main() {
    
    
   p:=f()
   pp:=f()
   *p=1
   fmt.Println(*pp)
}

这里的输出是0。这就和C语言不一样了,因为在C语言里面,函数里的变量都分配的是栈空间,比如下面这个函数:

int* f(){
   int i = 0;
   return &i;
}

这里会返回程序中的局部变量在函数栈中的地址,在编译时会报warning: address of local variable ‘i’ returned [-Wreturn-local-addr]

一般来说,go里面a:=&Type{}用的比a:=new(Type)多,因为a:=new(Type)在新建Type实例时只能初始化为0值,而a:=&Type{}可以指定初始值。

go的反射模型

在Golang实现的反射中,interface{}变量可以看作一个“pair”,“pair”中记录了实际变量的值和类型:(value, type)value记录了变量的值,type记录了变量的类型。这个“pair”在这个变量连续赋值的过程中不会发生变化。反射就是用来检测存储在interface{}变量内部“pair”对的一种机制。

基本功能:ValueOf和TypeOf

既然反射就是用来检测存储在interface{}变量内部“pair”对的一种机制,那么显然,任何反射操作的第一步都是将这个内部“pair”对取出来。在Golang的反射包reflect中,取出value的操作函数是reflect.ValueOf(...),取出type的函数是reflect.TypeOf(...)

这两个函数的定义:

// ValueOf returns a new Value initialized to the concrete value
// stored in the interface i.  ValueOf(nil) returns the zero 
func ValueOf(i interface{
    
    }) Value {
    
    ...}

ValueOf用来获取输入参数接口中的数据的值,如果接口为空则返回0

// TypeOf returns the reflection Type that represents the dynamic type of i.
// If i is a nil interface value, TypeOf returns nil.
func TypeOf(i interface{
    
    }) Type {
    
    ...}

TypeOf用来动态获取输入参数接口中的值的类型,如果接口为空则返回nil

猜你喜欢

转载自blog.csdn.net/weixin_54707168/article/details/113406390