作为本科期间一直以CPP和Py为主要编程语言的准研一,发现go语言的语法有其两者相似之处,也可以说是C的重大改进,它不但能让你访问底层操作系统,还提供了强大的网络编程和并发编程支持。Go 语言的用途众多,可以进行网络编程、系统编程、并发编程、分布式编程。
Go 语言的推出,旨在不损失应用程序性能的情况下降低代码的复杂性,具有部署简单、并发性好、语言设计良好、执行性能好等优势。很多重要的开源项目都是使用 Go 语言 开发的,其中包括docker,Go-Ethereum,Thrraform 和 Kubernetes。下面我想聊聊在入门golang之后发现一些有趣的特性。
返回值
golang允许在函数名后面提前定义返回值,最后返回时只需要return而不需要再写返回值名称
func REC() (r1 int, r2 int) {
r1 = 1
r2 = 2
return
}
结构体
结构体可以在外部定义方法但是想要修改参数则必须加指针
type book struct {
title string
auth string
}
func (a *book) Setname(name string) {
a.auth = name
}
继承与多态
// 继承
type jicheng struct {
book
index int
}
// 多态,只要把接口的方法全部实现就等于实现这个接口
type Animal interface {
say()
}
type Dog struct{}
type Cat struct{}
func (d Dog) say() {}
func (c Cat) say() {}
浅复制与深复制
这是我用golang在刷力扣的时候发现的,一维切片的复制是深复制,即不共享同一片内存区域。而出现二维则会是浅复制。这种情况下需要先append到一个空数组然后再append到目的数组上,这里可以用一个可爱的语法糖即三个点,可以将元素分别append过去。
interface
golang提供了一个万能接口,它可以是任意的类型,同时我们可以通过断言来判断是否是某个类型。
func F(arg interface{}) {
//断言
value, ok := arg.(string)
if ok {
print("the string is", value)
}
}
channel
不同于传统的多线程并发模型使用共享内存来实现线程间通信的方式,golang 是通过 channel 进行协程(goroutine)之间的通信来实现数据共享。可以通过make关键字来定义一个channel,通过箭头来生产或者消费里面的元素。chan的使用是阻塞的。也就是说下游从chan当中拿走一个数据我们才可以传入一个数据。否则的话,传输数据的代码就会一直等待chan清空。所以可以加一个容量参数作为缓冲。
天生并发
Go语言的并发通过goroutine实现,在调用函数时在前面加上go关键字,就可以为一个函数创建一个 goroutine。