Golang基础

一、简介

1.Go语言为并发而生

Go语言的并发是基于 goroutine 的,goroutine 类似于线程,但并非线程。可以将 goroutine 理解为一种虚拟线程。Go 语言运行时会参与调度 goroutine,并将 goroutine 合理地分配到每个 CPU 中,最大限度地使用CPU性能。开启一个goroutine的消耗非常小(大约2KB的内存),你可以轻松创建数百万个goroutine。

goroutine的特点:

1.goroutine具有可增长的分段堆栈。这意味着它们只在需要时才会使用更多内存。

2.goroutine的启动时间比线程快。

3.goroutine原生支持利用channel安全地进行通信。

4.goroutine共享数据结构时无需使用互斥锁。

中文文档:前景 · Go语言中文文档

2.go适合做什么

  • 服务端开发
  • 分布式系统,微服务
  • 网络编程
  • 区块链开发
  • 内存KV数据库,例如boltDB、levelDB
  • 云平台

二、基础语法

1.主要特征

1)特征

1.自动立即回收。

2.更丰富的内置类型。

3.函数多返回值。

4.错误处理。

5.匿名函数和闭包。

6.类型和接口。

7.并发编程。

8.反射。

9.语言交互性。

2)命名

所有的go源码都是以 ".go" 结尾。Go的函数、变量、常量、自定义类型、包(package)的命名方式遵循以下规则:

1)首字符可以是任意的Unicode字符或者下划线

2)剩余字符可以是Unicode字符、下划线、数字

3)字符长度不限

关键字

    break        default      func         interface    select
    case         defer        go           map          struct
    chan         else         goto         package      switch
    const        fallthrough  if           range        type
    continue     for          import       return       var

可见行

1)声明在函数内部,是函数的本地值,类似private

2)声明在函数外部,是对当前包可见(包内所有.go文件都可见)的全局值,类似protect

3)声明在函数外部且首字母大写是所有包可见的全局值,类似public

3)语言声明

有四种主要声明方式:

var(声明变量), const(声明常量), type(声明类型) ,func(声明函数)。

Go的程序是保存在多个.go文件中,文件的第一行就是package XXX声明,用来说明该文件属于哪个包(package),package声明下面就是import声明,再下来是类型,变量,常量,函数的声明。

2.语法特点

1)特殊点

  1. “_"下划线:a.忽略这个变量;b.占位符;c.import包不直接使用,只执行包的init函数。
  2. 定义的变量必须被使用到。
  3. 要修改字符串,需要先将其转换成 []rune[]byte ,完成后再转换为string。当需要处理中文、日文或其他复合字符时,需要用rune类型。

2)数组

数组:是同一种数据类型的固定长度的序列。

数组定义:var a [len]int,比如:var a [5]int,数组长度必须是常量,且是类型的组成部分。一旦定义,长度不能变。

  • 长度是数组类型的一部分,因此,var a [5]int和var a[10]int是不同的类型。
  • 访问越界,如果下标在数组合法范围之外,则触发访问越界,会panic
  • 数组是值类型,赋值和传参会复制整个数组,而不是指针。因此改变副本的值,不会改变本身的值。
  • 支持 "=="、"!=" 操作符,因为内存总是被初始化过的。
  • 指针数组 [n]*T,数组指针 *[n]T。

初始化方式:

    a := [3]int{1, 2}           // 未初始化元素值为 0。
    b := [...]int{1, 2, 3, 4}   // 通过初始化值确定数组长度,多维数组第2维不能使用"..."
    c := [5]int{2: 100, 4: 200} // 使用引号初始化元素。

3)切片

切片:切片是数组的一个引用,因此切片是引用类型。但自身是结构体,值拷贝传递。

  • 切片的长度可以改变,因此,切片是一个可变的数组。
  • 切片遍历方式和数组一样,可以用len()求长度。表示可用元素数量,读写操作不能超过该限制。
  • cap可以求出slice最大扩张容量,不能超出数组限制。0
  • 切片的定义:var 变量名 []类型,比如 var str []string。
  • 如果 slice == nil,那么 len、cap 结果都等于 0。

数组和切片的区别

  1. 数组是数据类型是值类型,切片的数据类型是引用类型。
  2. 数组声明时需要指定长度,且长度固定不可扩容,长度和容量一致;
  3. 切片不定长,可以自动扩容,长度和容量不一定一致。
  4. 切片其实是指向一个底层数组,操作切片的元素实际是操作数组的元素。如果切片发生扩容,会新建底层数组。

初始化方式:

var slice0 []int = arr[start:end]    //a[x:y:z] 切片内容 [x:y] 切片长度: y-x 切片容量:z-x
slice := make([]type, len, cap)    //type表示数组元素类型,len表示长度,cap表示容量。

append函数

append :向 slice 尾部添加数据,返回新的 slice 对象

当超出原 slice.cap 限制,就会重新分配底层数组,即便原数组并未填满。 通常以 2 倍容量重新分配底层数组。

copy函数

copy(a,b) 将b的元素复制到a中,复制长度以 len 小的为准。

4)指针

&(取地址)和 *(根据地址取值)

new和make的区别:

1.二者都是用来做内存分配的。

2.make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身;

3.而new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。

5)占位符

%v:获取数据的值,如果实现了error接口,仅表示错误消息。
%+v:获取数据的值,如果结构体,会携带字段名。
%#v:获取数据的值,如果是结构体,会携带结构体名和字段名。
%T:输出结构体名称,或输出目标的类型。
%%:输出字面上的百分号。
%b:二进制表示
%c:相应的Unicode码所表示的字符。
%s:字符串
%d:十进制表示
%q:双引号围绕的字符串
%t:布尔占位符。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值