学习笔记整理——Go语言

本文是一篇关于Go语言的学习笔记,涵盖了从基础到高级的知识点,包括变量、数据类型、流程控制、数组、切片、map、函数、错误处理等方面。特别强调了Go语言的特性,如语法简洁、变量转换、字符串处理、并发机制等,并提供了丰富的示例代码。此外,还介绍了Go在区块链领域的应用以及学习Go语言的方向,如服务器端、游戏软件和分布式/云计算软件开发。
摘要由CSDN通过智能技术生成

目录

1.开端

1.1 Go的学习方向

1.2 Go的“hello world!”程序

1.3语言特色/使用技巧

1.4相关英文单词

2.变量(variable)

2.1变量声明(变量定义)

2.3 数据类型

2.2注意事项

2.4查看一个变量的数据类型和占用字节数

2.5浮点型

2.6字符类型

2.7布尔类型

2.8字符串类型

2.9变量值输出方式

2.10基本数据类型的转换

2.11基本数据类型转string类型

2.12 String转基本数据类型

2.13堆区和栈区

2.14遍历字符串

3.符号

3.1.转义字符

3.2标识符

3.3算术运算符

3.4关系运算符&逻辑运算符

3.5位运算符

3.6赋值运算符

4.流程控制

4.1 if - else结构

4.2 for循环结构

4.3 Switch结构

5.数组(array)

5.1 数组的声明

5.2 数组的遍历

5.3 二维数组

6.切片(slice)

6.1 切片的声明

6.2 切片的特性

6.3 切片的复制拷贝(同底层数组)

6.4 切片的遍历

6.5 为切片添加元素

6.6 复制切片(非同底层数组)

6.7 删除切片中的元素

6.8 通过切片对数组进行排序

7.map

7.1 map的声明

7.2向map中添加键值对

7.3判断某个键值对是否在map中

7.4删除某个键值

7.5遍历map

7.6包含map的切片

7.7实例

8.函数

8.1 函数的定义

8.2 函数的调用

8.3 函数接收可变参数

8.4 延迟调用(defer)

8.5函数变量访问

8.6函数可以作为变量和参数

8.7匿名函数

8.8闭包(Closure)

8.9运行时发生的错误

8.10宕机(panic)


1.开端

1.1 Go的学习方向

1.区块链工程师

区块链:区块链是一种带有数据“散列验证”功能的数据库。区块,就是数据块,按照时间顺序将数据区块组合成一种链式结构,并利用密码学算法,以分布式记账的方式,集体维护数据库的可靠性。所有数据块按时间顺序相连,从而形成区块链。

2.Go服务器端/游戏软件工程师

3.Golang分布式/云计算软件工程师

1.2 Go的“hello world!”程序

我的第一段go代码,我要从此刻开始码go了,2021年3月11日14:57:15!

package main
import "fmt"
func main(){
   fmt.Println("hello,world!")
}
//说明:1,go文件后缀为.go
//2,package main表示hello.go文件所在的包是main(每个文件都必须属于一个包)
//3,import "fmt"表示引入一个包,其包名为"fmt"(为了使用包内的函数)[类似C的include?]
//4,func main()[  func为关键字,表示后面是一个函数,main为主函数,程序的入口
//5,fmt.Println表示调用fmt包内的函数Println输出"hello,world!”
//6,通过go build命令对该go文件进行编译,输出.exe文件
//7,执行结果:
/*
GOPATH=C:\Users\lenovo\go #gosetup
E:\Go\bin\go.exe build -o C:\Users\lenovo\AppData\Local\Temp\___go_build_hello_go.exe E:/Coding/go_project/src/go_code/project01/main/hello.go #gosetup
C:\Users\lenovo\AppData\Local\Temp\___go_build_hello_go.exe #gosetup
hello,world!

Process finished with exit code 0
*/

1.3语言特色/使用技巧

1.go语言的代码末不需要加上分号,系统会默认加上

2.引入多个包时可以一个个引:

import “fmt”

import “unsafe”

但最好用更专业的引入方法:

import(

“fmt”

“unsafe”

)

注: 在一个包前面加上_表示忽略该包,适用于用不到包却又不想删去的情况

它的本质是:让Go语言对包做初始化操作,但是不使用包内的标识符(即如果在包内存在init函数时调用该函数)

        1.保小不保大,go语言尽量用合适大小的变量

例如,年龄变量最好用byte(byte0-255范围足够包括年龄可能的范围),而非使用int

        2.Go语言要求可执行程序必须位于main包中,且需要在main包中找到main函数,把它作为程序的入口

        3.任何包中如果存在func init函数,即是包中存在main函数且main函数中没有调用init函数,编译器在导入包时/执行main函数前都会先自动调用init函数(注:init函数要在main函数之前声明)

1.4相关英文单词

overflow 溢出(内存溢出)

omit 省略,删除

assignment 任务,指派

syntax 句法(语法)

index 索引

prefix 前缀

suffix 后缀

field 字段

stdout 标准输出

stderr 标准错误

2.变量(variable)

2.1变量声明(变量定义)

单变量定义:

法1:var i int = 10(定义了一个初值为10的int类型的变量i)

法2:var f = 10.11(省略数据类型,会智能根据赋值的数据选择类型)

法3:name := “tom”(可以省略var而用:=,此符号代表定义并赋初值)

多变量定义:(不同类型智能定义)

var i,name,j = 10,”tom”,10.11

或(同类型多个定义)

var i,j,k int

不可以(不同类型多个定义)

var i,name,j int,string,int

2.3 数据类型

1.基本数据类型

(1).整数类型

int,int8,int16,int32,int64,uint,uint8,uint16,uint32,uint64,byte

int后面带的数字为占用存储空间的bit,例如int8为一个字节

uint为无符号整型

(2).字符型

没有专门的字符型,用byte保存单个字符

(3).布尔型

bool

(4).字符串

string

(5).浮点型

float32,float64

2.复杂数据类型

(1)指针

(2)数组

(3)结构体

(4)管道

(5)函数

(6)切片

(7)接口

(8)map

2.2注意事项

1.若不赋初值:

int,float类型默认为 0

string类型默认为 ”” 空字符串

bool类型默认为false

2.go中的加号:(+)

(1)左右两边为数值型,做加法运算

(2)左右两边为字符串,做字符串拼接

2.4查看一个变量的数据类型和占用字节数

printf(“数据类型为:%T,占用字节数为:%d”,n,unsafe.sizeof(n))

注:

1.unsafe为一个包,sizeof为该包内函数

2.go语言严格区分大小写,%T的T一定要大写

2.5浮点型

浮点型形式:

        1, 1.11十进制正常形式

        2, .123 十进制省略0形式

        3, 5.12e-2 等价于0.0512 科学计数法形式

2.6字符类型

        1.go中若要存储单个字符,推荐使用byte类型,例如 var i byte = ‘a’

        2.若要存储中文字符,则无法使用byte,会出现溢出,但是可以如下使用

func main() {
   var i int = '嚄'
   fmt.Printf("%c,%d",i,i)
}

即可以用%c输出某数字对应unicode编码下的字符

常识:go语言使用UTF-8编码,英文字母一个字符,汉字三个字符

        3.go的字符串与传统的字符串不同,传统的字符串由字符组成,go则是由字节组成

        4.若直接输出byte值,则输出的为ascII码值

        5.字符类型可以进行运算,按其对应码值进行运算

2.7布尔类型

        1.布尔类型只允许取值true和false(是的,不是0和1,而是true和false)

        2.在空间中占用一个字节

        3.默认值为false

2.8字符串类型

        1.go的字符串并非由单个字符拼接而成,而是由单个字节拼接而成

        2.字符串一旦赋值了,在go语言就不能更改字符串中单独的某一个字符了,要改需要整体进行更改

        3.除了双引号””,反引号也可以用于输出字符串` `,且是以原生输出(不识别特殊字符,例如\n)的方式输出

例如,可以将源代码用反引号括起来,有时候会很方便且可以防止攻击

        4.字符串拼接方式:“+”号,当拼接操作很长的时候,可以换行处理,但是一定要把+留在上一行(go看到+则不会默认加上分号)

2.9变量值输出方式

例:

var i int
var j float32
var k float64
var right bool
var story string
fmt.Println(i,j,k,right,story)[法一]
fmt.Printf("%d,%f,%f,%v,%v",i,j,k,right,story)[法二]

%v 表示按照值的默认的格式输出

2.10基本数据类型的转换

-> 与C语言不同,go的不同类型变量之间赋值时需要显示转换,即go中数据类型不能自动转换

基本语法:

表达式T(v)将值v转换为类型T

注:T就是转换后数据类型,例如:int32,float64等

v就是需要转换的变量

例:

var i int = 100;

若希望将i转换为float类型

错误转换法: var n1 float32 = i

正确转换法: var n2 (float32) = float32(i)  [前float32可有可无]

ps:

一些其他语言 var n3 int8 = i是可以的,语言会判定由高精度转低精度

但这种情况go也不行,还是需要用到上述转换方式:

var n4 (int8) = int8(i)

一些细节注意:

1,go中可以将表示范围小的数据类型转换为大的,反之也可以转换

2,被转换的是变量存储的数据(值),变量本身的数据类型并没有变换(上方例子中i仍是int类型)

3,在转换中,比如将int64转换为int8,编译时不会报错,只是转换的结果有时候会按溢出处理,可能和我们想要的结果不太一样

3(拓展):

var i int32 = 10

var n3 int8 = 127 + int8(i) 结果:可通过编译,但是会造成溢出

var n4 int8 = 128 + int8(i) 结果:不可通过编译,因为128已超出int8的范围

2.11基本数据类型转string类型

法一: fmt.Sprintf(“%参数”,表达式)[效率低]

注:%参数的依据为被转换为string的数据类型对应的参数

例:

var num1 int = 99

var str string

str = fmt.Sprintf(“%d”,num1)

fmt.Printf(“str type is %T str = %v”,str,str)

法二:使用strconv包的函数

func FormatBool(b bool) string

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值