Golang部分语法

此文主要参考 Go语言四十二章经

String

// 中文和英文的占位
package main

import (
	"fmt"
)

func main() {
	s := "Go语言四十二章经"
	for k, v := range s {
		fmt.Printf("k:%d,v:%c == %d\n", k, v, v)
	}
}

// 程序输出:
// k:0,v:G == 71
// k:1,v:o == 111
// k:2,v:语 == 35821
// k:5,v:言 == 35328
// k:8,v:四 == 22235
// k:11,v:十 == 21313
// k:14,v:二 == 20108
// k:17,v:章 == 31456
// k:20,v:经 == 32463

strings.Join()

  strings.Join([]string{"hello", "world"}, ", ")

Join会先根据字符串数组的内容,计算出一个拼接之后的长度,然后申请对应大小的内存,一个一个字符串填入,在已有一个数组的情况下,这种效率会很高,但是本来没有,去构造这个数据的代价也不小。

Array

var arr1 = new([5]int)
var arr2 [5]int

arr1类型为数组指针,arr2类型为数组,这个区别会导致在赋值和传递参数中会有很大影响。

Slice

关于使用 append 扩容, 当切片进行扩容时,它会新建一个并分配原切片两倍的空间进行存放新数据,同时当切片容量超过1024时,后面扩容将固定增加1024。

switch

case满足指定条件当是确又想继续执行时,可以使用fallthrough 关键字。

并发(没特殊,重复一下)

并发是在同一时间处理多件事情。并行是在同一时间做多件事情。并发的目的在于把当个 CPU 的利用率使用到最高。并行则需要多核 CPU 的支持。

Go 语言在语言层面上支持了并发,goroutine是Go语言提供的一种用户态线程,有时我们也称之为协程。所谓的协程,某种程度上也可以叫做轻量线程,它不由系统而由应用程序创建和管理,因此使用开销较低(一般为4K)。我们可以创建很多的协程,并且它们跑在同一个内核线程之上的时候,就需要一个调度器来维护这些协程,确保所有的协程都能使用CPU,并且是尽可能公平地使用CPU资源。

调度器的主要有4个重要部分,分别是M、G、P、Sched。

  • M (work thread) 代表了系统线程内核线程,由操作系统管理。
  • P (processor) 衔接M和G的调度上下文,它负责将等待执行的G与M对接。P的数量可以通过GOMAXPROCS()来设置,它其实也就代表了真正的并发度,即有多少个goroutine可以同时运行。
  • G (goroutine) 协程的实体,包括了调用栈,重要的调度信息,例如channel等。

评论