Golang相关概念

new和make的区别

  • new 的作用是初始化一个指向类型的指针(*T),使用new函数来分配空间。传递给new 函数的是一个类型,不是一个值。返回值是 指向这个新分配的零值的指针。
  • make 的作用是为 slice,map 或 chan 初始化并返回引用(T)。
  • make函数的目的与new不同。它仅仅用于创建 Slice, Map 和 Channel,并且返回类型是 T(不是*T)的一个初始化的(不是零值)的实例

数组与切片的区别

  • 数组 数组是具有固定长度且拥有零个或者多个相同数据类型元素的序列。 数组的长度是数组类型的一部分,所以[3]int 和 [4]int 是两种不同的数组类型,数组需要指定大小,不指定也会根据初始化的自动推算出大小,不可改变
  • 数组是值传递,作为方法的参数传入时将复制一份数组而不是引用同一指针
  • 切片 切片表示一个拥有相同类型元素的可变长度的序列。有三个属性:指针,长度和容量,切片不需要指定大小,切片是地址传递。切片可以通过数组来初始化,也可以通过内置函数make()初始化 .初始化时len=cap

Go 协程

  • 只需要在函数调用前添加go关键字即可实现go的协程,创建并发任务
  • 关键字go并非执行并发任务,而是创建一个并发任务单元

Go 高级for循环

  • 循环嵌套的操作,在循环外使用label标记退出哪一层循环的方式。
  • 支持使用平行赋值的方式来初始化多个变量
I:
	for i := 0; i < 2; i++ {
		for j := 0; j < 5; j++ {
			if j == 2 {
				break I
			}
			fmt.Println("hello")
		}
		fmt.Println("hi")
	}

Go switch语句

  • 单个case中,可以出现多个结果选项
  • 只有在case中明确添加fallthrough关键字,才会继续执行紧跟的下一个case

go语言中没有隐藏的this指针

  • 方法施加的对象显式传递,没有被隐藏起来
  • golang的面向对象表达更直观,对于面向过程只是换了一种语法形式来表达
  • 方法施加的对象不需要非得是指针

Go指针运算

  • ”&“ 取地址
  • ”*“ 取地址指向的值

Go main函数

  • 不能带参数
  • 不能有返回值
  • 只能在main包执行

Go语言同步锁

  • 互斥锁 Mutex
    • type Mutex struct {}
    • 有两个方法,Lock()UnLock()
    • sync.Mutex一旦被锁住,其它的Lock()操作就无法再获取它的锁,只有通过Unlock()释放锁之后才能通过Lock()继续获取锁。
    • 已有的锁会导致其它申请Lock()操作的goroutine被阻塞,且只有在Unlock()的时候才会解除阻塞
    • 在Lock()和Unlock()之间的代码段称为资源的临界区(critical section),在这一区间内的代码是严格被Lock()保护的,是线程安全的,任何一个时间点都只能有一个goroutine执行这段区间的代码
    • sync.Mutex不区分读写锁,只有Lock()与Lock()之间才会导致阻塞的情况,如果在一个地方Lock(),在另一个地方不Lock()而是直接修改或访问共享数据,这对于sync.Mutex类型来说是允许的
    • Mutex保证了每个临界区安全,某一时间点只有一个goroutine访问到这部分,但也因此而出现了随机性
    • 内置类型的共享变量来说,使用sync.Mutex和Lock()、Unlock()来保护也是不合理的,因为它们自身不包含Mutex属性。真正合理的共享变量是那些包含Mutex属性的struct类型
    type mytype struct {
    	m   sync.Mutex
    	var int
    }
    x := new(mytype)
    
  • 读写互斥锁RWMutex
    • 读锁的时候,可以随便读,多个协程同时读,但是阻塞写
    • 写的时候,不支持读也不支持写
    • Lock()和Unlock()用于申请和释放写锁
    • RLock()和RUnlock()用于申请和释放读锁,一次RUnlock()操作只是对读锁数量减1,即减少一次读锁的引用计数
    • 如果不存在写锁,则Unlock()引发panic,如果不存在读锁,则RUnlock()引发panic
    • RLocker()用于返回一个实现了Lock()和Unlock()方法的Locker接口
  • Once 只会执行一次
  • WaitGroup一个goroutine集合,当集合里的goroutine执行完毕后,这个wg就会自动结束,
    • Add(delta int) // 定义大小
    • Done() // goroutine执行完毕后调用
    • Wait() // 阻塞主goroutine

Go channel

  • 给nil channel 发送数据,阻塞
  • 从nil channel 读数去,阻塞
  • 关闭的channel 发数据,panic
  • 关闭的channel接收数据,缓冲区无数据,返回一个零值
  • 无缓存的channel是同步的,有缓冲channel是非同步的

Go for range

  • for range创建了每个元素的副本,而不是直接返回每个元素的引用,如果使用该值变量的地址作为指向每个元素的指针,就会导致错误,在迭代时,返回的变量是一个迭代过程中根据切片依次赋值的新变量,所以值的地址总是相同的,导致结果不如预期
  • 遍历特殊元素数组时建议使用普通循环方式

Go interface 结构

Go的interface的Duck-typing机制

  • 待补充,先挖坑

其他

  • 对象和对象指针在golang中的微妙处理,golang可以自动将对数据类型定义的方法抓转换成对数据类型指针定义的方法。但不能自动的将对数据类型指针的方法转换为对数据类型定义的方法

Golang Slice 底层结构

  • 指向底层数组的指针
  • 切片的长度
  • 切片的容量

Golang slice扩容机制

  • 创建一个有长度的切片时,容量为长度的两倍
  • 无长度的切片,初始化长度和容量都为0
  • 旧容量 小于1024时,容量翻倍
  • 容量大于1024时,每次涨旧容量的四分之一

Golang 参数传递

  • Golang所有的参数传递都是值传递,都是一个副本一个拷贝

Golang 引用类型

  • map
  • channel
  • slice

Golang 接口接收规则

  • 实体类型实现接口,实体类型和指针都实现了接口
  • 实体类型的指针实现接口,则只有指针可以调用方法

Golang context

  • 挖坑,后续补充
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值