豆播客

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 202|回复: 0

GoLang学习笔记

[复制链接]

12

主题

12

帖子

104

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
104
发表于 2021-2-5 22:59:38 | 显示全部楼层 |阅读模式
数据类型转换:
go语言中由高位向低位转换会溢出处理结果输出-1,如
  1. var i int64 = 99999
  2. var n int8 = int8(i)
  3. fmt.Println("n")
复制代码
最后的输出结果为 -1 (输出结果随机)
并且数据类型会发生变化,由int64变为int8


不同数据类型无法转换
赋值:
变量使用var定义后无法使用var重新定义

赋值的变量的类型必须要等于等号右边值的类型
如 var b int = &i 就会报错,等号右边为整数型指针,而赋值的b类型为整数型。修改为 var b *int = &i 就可以正常运行


&号在golang中解释为变量在内存中的地址,而*代表通过内存地址查找地址所代表的值

fmt.Printf会对占位符进行解释 而 fmt.Println不会对占位符解释

_在golang中表示两种意思,常用为 忽略
如 import _ "fmt" 此时fmt包不会被加载
  1. var i int = 123
  2. var b *int = &i
  3. var a_ = *b
  4. fmt.Printf("%v",a_)
复制代码
而a_ 则表示一个变量a后的_不代表忽略

Golang系统保留字符 共计25个 int不是保留字符,但不要用做变量!(我觉得可以用来恶心人
QQ截图20210206142753.png

变量名、函数名、常量名首字母大写则可以被其他包访问,否则为私有,仅可在本包访问使用package包名可以不与所在文件夹以及go文件名相同,import引入包仅需引入包所在文件夹即可,调用包中函数则为 包名.函数

在函数外 变量必须由var声明


运算符
使用/时注意,运算后会舍弃余数,如8/3,结果为2,剩下的2会被舍弃,%则为求余,9%2结果为1
运算时注意!若要求小数部分必须使被除数有小数位,如8/3,需改为8.0/3,输出结果为2.66667  float32精确到小数点后5为,float64精确到小数点后14位
QQ截图20210206163159.png
逻辑运算符
&& 逻辑与 两边都为真结果为真 || 逻辑或 两个有一个为真结果为真 ! 逻辑非 结果与条件相反


三元运算理解
i > u ? a : b  i大于u成立不成立,成立返回a,否则就返回b
golang没有三元运算,只能用if和else,如下
  1. if i > n {
  2.         return a
  3. }else{
  4.         return b
  5. }
复制代码

冒号含义

冒号常用含义为声明,如在:=中,它表示的含义就等价于var,都给声明变量
而在数组中,使用方法为[int,int]
  1. package main

  2. import "fmt"
  3. func main()  {
  4.         a := []string{"Asd","Sda","dsf","fghu"}
  5.         fmt.Println(a[:3])
  6. }
复制代码
上面的结果输出为 [Asd Sda dsf] ,:3表示的含义就为输出a数组中前3个组中的内容,而如果把 :3 更改为 1:3 则输出的内容为 [Sda dsf]
即从第零个组("Asd")开始,除去第零个组,到第四个组("fghu"),除去第四个组的内容输出。也可以说是掐头去尾

defer的功能及用法
defer的功能是延迟,将defer所包含的函数在所有命令执行完后再执行
  1. defer fmt.Println("豆播客")
  2. fmt.Println("新年好!")
复制代码
如上面两个命令,输出的形式为:新年好!豆播客
注意:defer使用必须要是函数!!!!

make作用

为变量分配相应空间以供数据传入

  1. var data []byte
  2. fmt.Printf("%v",data)
复制代码
输出的结果为[]
而如果
  1. var data = make([]byte,3)
  2. fmt.Printf("%v",data)
复制代码
就会输出[0 0 0],make在这里表示为byte数组类型并创建3个数组,前面的=则为赋值

简单理解就是 var data []byte单纯声明data是一个byte数组,但是并没有组的空间
而make就是创建一个byte数组,并创建3个组空间,=号将这个创建了3个空间的byte数组赋值给data

make(chan string) 是创建一个string类型的管道

func理解
func () (a int){


}
第一个括号内是传入的值,第二个括号是声明一个整数型的a变量返回值


函数与类型
在go语言当中,有许多的类型与函数一样,如 http.Cookie{} 和 http.Cookie() ,虽说两种只是括号不同,但go语言理解的意思却千差万别,第一个 {} 的cookie表示是数组,如果在括号内加内容则表示给数组加内容,第二个则是一个函数,里面添加什么内容则要按照官方给出的命令使用


append
append是在每一个slice(可以理解为数组)后增加一个新的切片(数),每个数组在底层它的大小基本会写死,除非是对其进行增加,否则将会分配新的数组用来存放数据
比如下面:
  1. func main()  {
  2.         a := []int{1,2,3,4,5}
  3.         slice := a[:3]
  4.         slice = append(slice,1,2)
  5.         fmt.Println(a,slice)
  6. }
复制代码
输出结果为 [1 2 3 1 2] [1 2 3 1 2] ,我们给a这个数组加了5个值,那么它的片大小就为5,然后我们用slice变量获取了a变量数组的前3个值:1 2 3 ,随后我们使用append给slice增加了slice(1,2,3)和1,2 这三个数组,通过输出结果我们发现,a和slice的结果都是12312,因此,如果新的数组变量的大小,小于或等于旧的数组变量,那么新的数组变量的修改会在旧的数组变量上进行修改,即 cap(slice)<cap(a),那么 修改 slice,那么a也会改变

  1. func main()  {
  2.         a := []int{1,2,3,4,5}
  3.         slice := a[:3]
  4.         slice = append(slice,1,3,5)
  5.         fmt.Println(a,slice)
  6. }
复制代码
相反,当 cap(slice)>cap(a) 时,go会给slice分配一个新的数组,在slice上的修改a不会同步修改

  1. func main()  {
  2.         a := []int{1,2,3,4}
  3.         fmt.Println(cap(a))
  4.         a = append(a,1)
  5.         fmt.Println(cap(a))
  6. }
复制代码
输出结果为4 8,第一次输出a的数组大小为4,而当我们在a上再增加一个数时,a的数组大小则变为了8,在1024之前,数组的大小如果超过原本的大小,将为翻倍*2进行增加,这与上面两例不同,我们是在其本身加数,go会自动扩大a

select管道通讯判断
select的case必须为通讯管道(个人理解,实际为IO)
  1. select{
  2. case <-ch:
  3.   要执行的代码
  4. }
复制代码
如上,如果ch一直没有存入数据那么select会一直循环

  1. select{
  2. case a:=<-ch
  3. fmt.Println(a)
  4. case <-time.After(time.Second*2)
  5. fmt.Println("test")
  6. }
复制代码


超时:超时就好像一个服务员来给两个人点餐,一个人在忙,你就一直问他,直到他回复你你才会去执行操作然后退出语句,而另一个人你问了他之后他告诉你两秒之后来找他,那么如果第一个人两秒内回复你了,就会执行第一个人的语句,否则两秒之后就会执行他的语句
实际则为 case第一个语句和第二个语句都没有取到内容,select就会堵塞循环,time.After语句会在两秒后返回内容,这时候有了io操作,就会执行time的语句

channel管道
make[chan string] 创建为无缓存管道make[chan string,3] 创建有3个空间的管道对于无缓存管道,在写入时必须要先读取管道才能写入,否则将会死锁对于有缓存管道,写入时必须小于等于缓存空间,否则会死锁。 读取时不能大于缓存空间,否则会死锁使用range遍历管道时必须先将管道关闭,否则会死锁,数据虽然会读出去,但for循环的range不会停止 关闭管道相当于给管道最后就加一个标志,告诉range,这里就没了,别读了管道堵塞可以防止主线程结束而没有运行完的协程被一并结束。不同协程可以共用一个管道,管道是一个指针地址,不受变量名影响
签名请不要带有违规信息
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|BeanBBS

GMT+8, 2021-4-21 01:27 , Processed in 0.048298 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表