golang基础语法快速回顾

最近准备深入学习下golang,所以花几分钟做一个快速回顾手册。

基础

变量声明
var age, sex int //可一次声明多个
var age = 10 //可自动声明
var sex int //没有初始化,为零值
//省略var
age := 10 //短声明,左边必须要是新的变量,不然用赋值 = ,只能被用在函数内部
值类型和引用类型
  • 值类型,赋值是值进行拷贝,修改不会影响其他。
  • 引用类型,是存储地址进行拷贝,一个修改后,会改变原始值。
常量

const

const LENGTH int = 10 //1.
const ( //2.枚举
	Female = 1
    Male = 2
)
const(
	a = iota //0
    b //1
    c //2
    d = "mirror"
    e //"mirror"
)

iota常量中的索引,在const关键字出现时被初始化为0,const每新增加一行,增1.注意,新版本1.11的功能好像变了!中间出现断层后,后面的都是断层字段。

运算符

其他没啥好讲的,主要是&*,一个取地址符,一个指针。

函数
func toString(user User) string { //参数,前面是参数,后面是类型, string是返回类型
    //todo
}

函数参数

  • 值传递
  • 引用传递
数组
var arr = [5]int{1,2,3,4,5} //明文固定大小
var arr = [...]int{1,2,3} //系统判断大小
指针

&取地址符。放到变量前面,就会返回变量的内存地址。

什么是指针:指向一个值的内存地址。

var pointer *int //一个int类型的指针

如何使用指针:

  1. 定义指针变量
  2. 为指针变量赋值(有取地址符的变量)
  3. 通过指针,访问值。
var address string = "黄土高坡"
var addressPointer *string // step 1
addressPointer = &address // step 2
fmt.Println(addressPointer) // step 3

空指针:没有被分配任何变量,值为nil.

结构体

类似于类,可以存放不同类型的多种属性。

type User struct { //定义
    name string
    age int
}
john := User {"John", 24} //声明
fmt.Println(john.name, john.age) //访问结构体成员
//定义结构体指针,使用方式看指针
var ptr *User
//通过指针传递参数,好处多多,节省内存空间,只需注意内部改动会影响外部。
toString(user *User) string {}
切片

动态数组,由于数组长度不可变等问题,切片强化了数组的功能。

var slice1 []int //定义未指定大小的切片
var slice2 []int = make([]int, 10) //通过make创建
slice3 := make([]int, 10) //简写

初始化

slice1 := []int {1,2,3} //直接初始化
slice2 := arr[:] //引用了数组arr,冒号前后可设置索引值,表示引用数组的哪一段,前闭后开
slice3 := slice1[:] //加上中括号,可以选择性赋值,不加就全部赋值

len()&cap()

  • len()获取切片的长度,也就是包含的元素个数
  • cap()获取切片的容量,从第一个元素开始,到其底层数组元素末尾的个数。

cap()的概念有点不通俗,多看几个例子,体会一下。

arr := [6]int{1,2,3,4,5,6}
s1 := arr[:] //全盘收,所以len=6,cap=6
s2 := s1[:0] //长度明显为len=0,容量为第一个元素,到底层数组arr末尾的个数cap=6
s3 := s2[:4] //长度为len=4,容量为第一个元素,到底层素组arr末尾的个数cap=6【这个区间值得玩味,明明s2的长度为0】
s4 := s3[2:] //长度为s3的[:4]加上现在的左区间[2:]变成了[2:4]所以,len=2,容量2到6,cap=4

append()&copy()

增加切片容量的方式。

  • copy()拷贝切片
  • append()向切片追加新元素
Range

循环用。用于迭代数组、切片、通道、集合等。

for k, v := range arr {}
//也可丢弃k,v中的某项
for _, v := range arr {}
集合-Map

无序键值对。

var _map map[int]string //普通声明
_map := make(map[int]string) //make声明

delete()

根据key删除元素

delete(_map, 1)
类型转换
string(num)
接口

只要实现了接口中的方法,就是实现了这个接口。那个鸭子定理什么的,主要看起来像,就是了。

/*定义接口*/
type User interface {
    run()
}
/*通过结构体去实现*/
type WhitePeople struct {}

func (whitePeople WhitePeople) run() {} //隶属于whitePeople结构体的方法run(),说明实现了User接口。
错误处理

提供内部错误接口,结构体实现Error()方法后,就表示拥有了error接口的能力

type error interface {
    Error() string
}
并发

go&goroutine&channel

  • go是关键字,用来开启goroutine
  • goroutine是轻量级线程
  • channel通道,用于在goroutine中传递数据

并发的是某个函数,所以:

go toString() //通过go关键字调用某个函数

ch := make(chan int) //声明通道
ch <- v //把数据v传入ch,注意v的类型
v := <-ch //从ch接收数据并复制给v

ch := make(chan int, 2) //第二个参数设置缓冲区,不然等待接收方的时候可能会导致阻塞
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值