go语言基本语法

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)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzxfxy.html