Go语言特性
目录
Go语言有垃圾回收、天然并发、channel和支持多值返回这四个独特的特性。
1.1 垃圾回收
在垃圾回收上,Go内存可自动释放,无需开发人员管理内存,new()分配的内存会自动释放。
如在链表的操作中,我们删除链表中的某个节点时,无需像C++需要用delete()删除,Go会自动释放不会产生内存泄漏。如删除student链表里的stu6节点,代码如下:
由下面代码可见,当删除链表中的"stu6"节点时,我们之间另此节点的前一个节点的 .next指向此节点的下一个节点地址即可,无需调用delete()再删除这个内存。
func delNode(p *Student) {
var prev *Student = p //prev为待删除节点的前一个节点
for p != nil { //遍历链表,找到节点
if p.Name == "stu6" {
prev.next = p.next //令待删除节点的next直接指向待删除节点的下一个节点
p.next = nil
break
}
prev = p
p = p.next
}
}
1.2 天然并发
在语言层面支持并发,用goroute实现,代码和结果过下:
由输出可见,0~9序列的输出为随机态,并发特性非常明显。
package main
import (
"fmt"
"time"
)
func test_goroute(a int) { //测试并发
fmt.Println(a)
}
func main() {
for i := 0; i < 10; i++ {
go test_goroute(i)
}
time.Sleep(time.Second)
}
1.3 Channel
channel是用来传递数据的一个数据结构。其可用于两个 goroutine 之间通过传递一个指定类型的值来同步运行和通讯。操作符 <-
用于指定通道的方向,发送或接收。如果未指定方向,则为双向通道。
如以下实例通过两个goroute计算数字之和
package main
import "fmt"
func sum(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
c <- sum // 把 sum 发送到通道 c
}
func main() {
s := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(s[:len(s)/2], c)
go sum(s[len(s)/2:], c)
x, y := <-c, <-c // 从通道 c 中接收
fmt.Println(x, y, x+y)
}
1.4 多值返回
Go中的一个函数可以返回多个值
package main
import "fmt"
func calc(a int, b int) (int, int) {
sum := a + b
avg := (a + b) / 2
return sum, avg
}
func main() {
sum, avg := calc(2, 4)
fmt.Println(sum, avg)
}