Go学习笔记

命令介绍:
1.go build 编译
2.go name.go向执行脚本文件一样执行代码
3.go install 先编译得到一个可执行文件,再将可执行文件拷贝到GOPATH/bin下面

交叉编译
go可支持跨平台编译
例如:在win里面编译出linux下可执行文件

变量
go语言中的变量需要先申明再使用,申明时需要指明变量类型
var s1 string
go 语言中变量申明必须使用,不然编译不过去。
推荐使用驼峰式命名 strStudent
申明变量同时赋值: var s1 string = “xiaoming”
简短变量申明: s3 := “heihei” 只能在函数中使用,不能在全局中使用
同一个作用域{}中不能重复申明同名的变量
——:匿名变量是一个特殊的变量

常量
常量定义之后在运行期间不能修改,批量申明
const (


)

iota
常量计数,只能在常量表达式中使用。实现枚举
当const出现的时候将被重置为0,const中每新增一行iota值增1。常量值不申明值类型则与上一个常量类型一致。

整型
uint8 对应byte型
int16 对应short型
int64 对应long型

特殊整型
uint 32位操作系统上位uint32;64位操作系统位uint64
int 32位操作系统上位int32;64位操作系统位int64
uintptr 无符号整型,用于存放一个指针

浮点型
float32与float64
go语言默认浮点型是float64

复数
complex64与complex128(做科学运算时涉及到)
###bool值
true与flase
不能与其他类型做转换

###字符串
常用方法
不能修改
###byte与rune
都属于类型别名

###字符串、字符、字节分别是什么?
字符串:双引号包裹
字符:单引号包裹,单个字母,单个符号,当个文字
字节:1byte=8Bit
go语言中字符串都是utf-8,utf-8中一个常用汉字通常占3个字节

在跨平台使用时,需注意⚠️int与uint的差异

Go语言中无法直接定位二进制数数
可以直接定义八进制数

fmt总结:

import "fmt"

//占位符

func main(){
	var n = 100
	fmt.Printf("%T\n",n)
	fmt.Printf("%v\n",n)
	fmt.Printf("%b\n",n) //二进制
	fmt.Printf("%d\n,n") //十进制
	fmt.Printf("%o\n",n) //八进制
	fmt.Printf("%x\n",n) //十六进制

	var s = "xiaoming"
	fmt.Printf("%c\n",s) //打印字符
	fmt.Printf("%s\n",s) //字符串
	fmt.Printf("字符串:%v\n",s)

Go语言中必须用“ ”包裹字符串,‘’包裹的是字符,1字节=8Bit(8个二进制位)
‘’反引号里面的内容原样输出

printf “Sprintf” 前者打印到终端,后者返回给字符串,可将字符串赋给一个变量再打印

英文字符为byte,中文及其他为rune

new与make的区别
二者都是用来做内存分配的。
make只用于slice、map以及channel的初始化,返回的还是这三个引用类型本身;
而new用于类型的内存分配,并且内存对应的值为类型零值,返回的是指向类型的指针。

Go命令:
go build:编译为二进制可执行文件
-o “xxx.exe”: 指定编译后的文件名称
go run xx.go :向执行脚本一样执行go代码
go install :先编译后拷贝,将可执行的二进制文件拷贝到GOPATH/bin路径下

#####GO语言文件语法基础
存放go语言文件名后缀为.go
文件第一行:使用package关键字申明包名
//单行注释
/* 多行注释
*/
编译可执行文件必须是main包并且里面是main函数(入口函数,没有参数也没有返回值)
go语言函数外的语句必须以关键字开头
var age int ✅
age = 18 ❌
函数内部定义的变量必须使用,否则编译不过

#####变量和常量
3种申明方式:
1.var name string
2.var name = “小明”
3.name := “小明” (函数内部使用)
匿名变量(哑元变量)
当有些数据必须接收但是并不使用它时,即可使用_来接收这个值

常量
const pi = 3.14
const notfound = 404
iota:枚举
2个要点:
1.在const关键字出现时值被置为0
2.每新增一行常量申明,iota值增加1
#####流程控制
IF
if 条件 {
xxxxxxx
} else if 条件{
xxxxxx
}

#####For循环

1.for i:=0;i<10;i++ {
    fmt.printf("xxxx")
}
2.var i = 0 //函数内部变量只能在函数内部使用
for ;i<10;i++ {
    fmt.printf("xxxx")
}
3.var j =2
for ;j<10 {
   fmt.printf("xxxx")
   j++ 
   }
 4.for {
   fmt.printf("xxxx") 
}//死循环

5.
s = "hello"
fmt.printf(len(s))
//哑元变量,不想使用的变量使用它
//for i,v := range s {
 //  fmt.println(i,v)
  // or   fmt.printf("%d %c\n",i,v)
}
for _,v := range s {
   fmt.println(v)
// or  fmt.printf("%c\n",v)

基本数据类型
整型
有符号整型:int8、int16、int32、int64
无符号整型:uint8、uint16、uint32、uint64
uintptr:指针

浮点型
float32与float64
go语言默认浮点型是float64

复数
complex64与complex128(做科学运算时涉及到)
###bool值
true与flase
不能与其他类型做转换

###字符串
常用方法
不能修改
###byte与rune
都属于类型别名

###字符串、字符、字节分别是什么?
字符串:双引号包裹
字符:单引号包裹,单个字母,单个符号,当个文字
字节:1byte=8Bit
go语言中字符串都是utf-8,utf-8中一个常用汉字通常占3个字节

位运算针对的是二进制

###复合数据类型
数组(唯一指定长度和类型)

数组遍历

切片
1.切片指向底层数组
2.切片的长度就是它的元素个数
3.切片的容量就是它从第一个元素到最后一个元素的数量
4。切片支持扩容

切片本质
切片就是一个框,框住一块连续的内存,属于引用类型,真正的数据都是保存在底层数组中

注意⚠️:
切片之间是不能比较的,我们不能使用==操作符来判断两个切片是否含有全部相等元素。 切片唯一合法的比较操作是和nil比较。 一个nil值的切片并没有底层数组,一个nil值的切片的长度和容量都是0。但是我们不能说一个长度和容量都是0的切片一定是nil

####指针
Go语言中不需要记住指针操作,“&”取地址,“*”根据地址取值

####make与new的区别
1.make、new都是用来申请内存的
2.new很少用,一般都是用来给基本数据类型申请内存,string、int等,返回是对应类型的指针(*string、*int)
3.make是专门用来给slice、map、chan申请内存的,make返回的是对应的这三个类型的指针

####反射
IsNil()报告v持有的值是否为nil。v持有的值的分类必须是通道、函数、接口、映射、指针、切片之一;否则IsNil函数会导致panic。
IsValid()返回v是否持有一个值。如果v是Value零值会返回假,此时v除了IsValid、String、Kind之外的方法都会导致panic。

IsNil()常被用于判断指针是否为空;IsValid()常被用于判定返回值是否有效。

####结构体相关方法
在这里插入图片描述任意值通过reflect.TypeOf()获得反射对象信息后,如果它的类型是结构体,可以通过反射值对象(reflect.Type)的NumField()和Field()方法获得结构体成员的详细信息

反射是一个强大并富有表现力的工具,能让我们写出更灵活的代码。但是反射不应该被滥用,原因有以下三个。

基于反射的代码是极其脆弱的,反射中的类型错误会在真正运行的时候才会引发panic,那很可能是在代码写完的很长时间之后。
大量使用反射的代码通常难以理解。
反射的性能低下,基于反射实现的代码通常比正常代码运行速度慢一到两个数量级。

####并发
Go语言中的操作系统线程和goroutine的关系:

一个操作系统线程对应用户态多个goroutine。
go程序可以同时使用多个操作系统线程。
goroutine和OS线程是多对多的关系,即m:n。

####通道
关于关闭通道需要注意的事情是,只有在通知接收方goroutine所有的数据都发送完毕的时候才需要关闭通道。通道是可以被垃圾回收机制回收的,它和关闭文件是不一样的,在结束操作之后关闭文件是必须要做的,但关闭通道不是必须的。

关闭后的通道有以下特点:

对一个关闭的通道再发送值就会导致panic。
对一个关闭的通道进行接收会一直获取值直到通道为空。
对一个关闭的并且没有值的通道执行接收操作会得到对应类型的零值。
关闭一个已经关闭的通道会导致panic。

chan<- int是一个只写单向通道(只能对其写入int类型值),可以对其执行发送操作但是不能执行接收操作;
<-chan int是一个只读单向通道(只能从其读取int类型值),可以对其执行接收操作但是不能执行发送操作。

在函数传参及任何赋值操作中可以将双向通道转换为单向通道,但反过来是不可以的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值