go语言 提倡:所见即所得 支持高并发的原因:
Go语言的聚合类型(结构体和数组)可以直接操 作它们的元素,只需要更少的存储空间、更少的内存写操作,而且指针操作比其他间接操作 的语言也更有效率。由于现代计算机是一个并行的机器,Go语言提供了基于CSP的并发特性支持。Go语言的动态栈使得轻量级线程goroutine的初始栈可以很小,因此,创建一个 goroutine的代价很小,创建百万级的goroutine完全是可行的。
package main经过编译后可以得到一个可执行的二进制文件,那么该文件必有一个main函数,是整个程序的入口
不是main包,则是工具类等文件
函数外只能放一些变量的声明,函数的声明,类型的声明
go语言是静态类型语言。
python2不支持utf-8类型,也就是不支持中文编码。
标识符在编程语言中标识符就是程序员定义的具有特殊意义的词,比如变量名、常量名、函数名等等。 Go语言中标识符由字母数字和_(下划线)组成,并且只能以字母和_开头。 举几个例子:abc, _, _123, a123。
全局变量定义之后可以不使用,也能编译通过
go语言有类型推导
var ss = "string"还有简单变量声明,只能在函数中使用
ss := "string" // 隐式使用类型推导同一作用域不能重复声明同一个变量
常量不变的量,由const关键字定义,定义之后不能被重新赋值,pi,状态码
const ( n1 = 200 n2 n3 //不定义默认等于上面的值 )iota在const关键字出现时将被重置为0。const中每新增一行常量声明将使iota计数一次(iota可理解为const语句块中的行索引)。 使用iota能简化定义,在定义枚举时很有用。
定义数量级 (这里的<<表示左移操作,1<<10表示将1的二进制表示向左移10位,也就是由1变成了10000000000,也就是十进制的1024。同理2<<2表示将2的二进制表示向左移2位,也就是由10变成了1000,也就是十进制的8。)
const ( _ = iota KB = 1 << (10 * iota) MB = 1 << (10 * iota) GB = 1 << (10 * iota) TB = 1 << (10 * iota) PB = 1 << (10 * iota) ) 字符串go语言双引号包裹的是字符串,单引号包裹的是字符。
c1 := "string" c2 := \'s\' //字节,一个字节等于8Bit反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。
fmt.Sprintf // 有返回值,做字符串拼接当需要处理中文、日文或者其他复合字符时,则需要用到rune类型。rune类型实际是一个int32。
Go 使用了特殊的 rune 类型来处理 Unicode,让基于 Unicode 的文本处理更为方便,也可以使用 byte 型进行默认字符串处理,性能和扩展性都有照顾。
s2 := "白色" //[\'白\' \'色\'] s3 := []rune(s2) //把字符串强制转换成一个rune切片 // s3[0] = "红" // 报错,这是字符串 s3[0] = \'红\' // OK c1 := "红" // string c2 := \'红\' // rune(int32) fmt.Printf("c1:%T c2:%T\n", c1, c2) for循环Go语言中可以使用for range遍历数组、切片、字符串、map 及通道(channel)。 通过for range遍历的返回值有以下规律:
数组、切片、字符串返回索引和值。
map返回键和值。
通道(channel)只返回通道内的值。
数组go定义数组,需要定义数组的长度和元素的类型,一旦定义就不会再变,数组的长度是数组类型的一部分。
//不定义长度,根据初始值自动推断数组的长度 a1 := [...]int{1,2,3,4,5} a2 := [5]int{0:1, 4:2}数组是值类型(拷贝类型):把文档从目录a,拷贝到目录b,修改拷贝后各自的内容,均不改变对方的结果。
切片cap(),容量
切片指向了一个底层数组,它是动态的,是引用类型(快捷方式),修改底层数组,切片的值也会发生改变,修改切片的值,底层数据也会发生改变。
切片的容量是指底层数组的容量,容量的大小是从切片的第一个元素开始,到数组中最后一个元素的大小。
var a1 [8]int s1 := a1[0 : 3] s2 := a1[3 : 6] fmt.Println(len(s1), cap(s1)) //3, 8 fmt.Println(len(s2), cap(s2)) //3, 5 切片不能直接比较切片之间是不能比较的,我们不能使用==操作符来判断两个切片是否含有全部相等元素。 切片唯一合法的比较操作是和nil比较。 一个nil值的切片并没有底层数组,一个nil值的切片的长度和容量都是0。但是我们不能说一个长度和容量都是0的切片一定是nil,例如下面的示例:
var s1 []int //len(s1)=0;cap(s1)=0;s1==nil s2 := []int{} //len(s2)=0;cap(s2)=0;s2!=nil s3 := make([]int, 0) //len(s3)=0;cap(s3)=0;s3!=nil所以要判断一个切片是否是空的,要是用len(s) == 0来判断,不应该使用s == nil来判断。
切片相关函数append:append的结果必须用变量来接收
a := []int{1, 2, 3, 4, 5} //a = append(a[:2]) //fmt.Println(a) // [1 2] a = append(a[:2], a[3:]...) // ...就是把切片拆开的意思 fmt.Println(a)