go语言学习(二)-变量、常量、数据类型、表达式、流程结构

一、变量、数据类型、常量与枚举

1.变量

变量的使用步骤:声明变量 => 变量赋值 => 使用变量
A 声明
基本声明(var声明):var 变量名 变量类型 = 变量值或表达式
var name int  = 10

短变量声明:name := expression 
name := 10

多变量一起声明:
var i,j,k int
var b,f,s = true,2.3,"four"
n1,name,n3 := 100,"tom",888

B 注意事项
变量名在类型前;
变量声明后就要使用,否则编译无法通过。
常用短变量声明,只能在函数内部使用。
变量值与给定的变量类型需求不一致时,用var声明类型(如 表达式int64,需要int32)
声明时未给出表达式时,用var确定类型

短变量声明最少声明一个新变量,若其他变量已经声明过了,相当于赋值。

d.匿名变量
接收到多个变量,有一些变量使用不到,可以使用下划线_表示变量名称
name,_ := getNameAndAge()

B 声明变量省略
类型和表达式可省略一个,不可都省略。编译器类型推导(省略)
var name int 省略表达式,初始值默认类型的零值。
var name = 10 省略类型,类型由表达式决定;

2.常量与枚举
const 常量名 类型 = 值   (类型可省略)
const pi float64 = 3.14
const pi2 = 3.1415 // 可以省略类型
go语言中常量可以不用大写,因为大小写是有含义的(权限)。
cosnt数值可作为各种类型使用,当成一个文本

B 枚举
go中通过const定义常量枚举

 ~~iota
可被编译器修改的常量,作为自增值的种子,默认开始值为0,调用一次加1,遇到const重置为0

2.数据类型
A 概述
数据类型分为两大类:基本数据类型 + 复杂数据类型。
基本数据类型:数值(整型、浮点型、字符型),字符串,布尔型
派生/复杂数据类型:指针,数组,切片,map,函数,管道,结构体,接口

~~ 格式化输出变量信息 fmt.Printf()
查看变量的类型与字节大小 %T
fmt.Printf("a1的数据类型是%T,字节大小是%d", a1, unsafe.Sizeof(a1))
%v 通用值格式化输出
%T 值的数据类型
%#v 类型+值
%d (b,o,x,X) 十进制表示,进制表示
%c (%q) 字符(单引号)输出
%s (%q,x,X) 字符串输出
%p 指针值输出

~~go原生支持复数类型,用于数据处理与建模

B 注意事项
Go 语言的字符有以下两种:
byte 型,uint8重命名,代表了ASCII码的一个字符。
rune型,int32重命名,代表一个 UTF-8字符,需要处理中文、日文或者其他复合字符时。
原样输出用%c,实际存储的是一个数字。

浮点型都是float32,float64,没有double。

字符串在go中是基本数据类型

C 强制转换
go的数据类型转换不支持隐式转换,变量之间的类型转换需要显示转换。
范围小的转换到大的没问题,范围大的转换为小的编译不会报错,但会溢出。

值类型与引用类型(重点)
值类型:变量直接存储值,内存通常在中分配,包括基本数据类型、数组和结构体
引用类型:变量存储的是一个地址,地址对应的空间存储真正的值,内存在上分配。当没有任何变量引用这个地址时,由GC来回收。包括指针、切片slice、map、管道chan、interface等

~~值传递与引用传递


二、数据类型详解
1.基本数据类型介绍
数值(整型、浮点型、字符型),字符串,布尔型

2.字符串类型
A 概述

go中没有专门的字符类型,用byte单个字节存储,所以go的字符串是由单个字节连接起来的。
go中字符串一旦赋值,就不能修改了。

B 表示形式
双引号添加字符串,反引号原生形式添加字符串

4.复杂数据类型
指针
,数组,切片,map,函数,管道,结构体,接口

指针
基本数据类型、数组和结构体,变量存的就是值,也叫值类型。
获取变量的地址“&”,&num。
指针类型,指针变量存的是一个地址,地址指向的空间才是值。
var ptr *int = &num

*ptr:根据地址取值
go指针不能运算,只用于取值,所以比c语言简单。


三、表达式与运算符
1.算术运算符
+-(正负号)、+-*/%、自增自减、+(字符串相加)

~~注意事项
++和-- 只能独立使用,如不能 i++ > 0;只有后置++和--,没有前置
取模运算a % b = a - a / b * b ,如-10 % -3

2.比较运算符
==、!=、<、>、>=、<=

3.逻辑运算符
&&  II  !

~~注意事项
&& 短路与,第一个条件false,后面不执行
|| 短路或,第一个条件true,后面不执行

4.赋值运算符
=、+=、-=、*=、/=、%=

go语言不支持三元运算符。 go的设计理念是一种事情有且只有一种方法完成

算法:a和b交换,不允许使用中间变量
a=a+b b=a-b a=a-b

5.运算符的优先级


四、流程结构 if switch for
1.顺序控制
程序逐行执行

2.分支控制
A if
在go语言中 布尔表达式不用使用括号
条件表达式只能为true和false,不能使用0或非0表示真假
在if之后,条件语句之前,可以添加变量初始化语句,使用;进行分隔

条件表达式前可以加赋值语句

B switch
在go语言中,switch中的case不使用break,系统默认只执行一个。
case后可有多个表达式支持多条件匹配。
switch穿透:fallthrough继续执行下一个case,只能穿透一层,下下个只能在下个中添加fallthrough。


3.for循环
go语言中的for循环,只有for关键字,去除了像其他语言中的whiledo while.

A 基本使用

~~其他使用方式 while

for-break =》等价于 for ; ; {} 一个无限循环,所以加break

B for-range
用于遍历字符串和数组。

字符串按照字节来遍历字符串,出现汉字会出现乱码,汉字对应3个字节,转为切片遍历。

C break与continue
跳出循环与跳出本次循环。
支持设置标签跳转

五、容器介绍
1.数组 []
A 概述

声明一块具有相同数据类型的指定大小内存空间,来存储数据集合。
必须要有数组长度,相同数据类型。
所以数组的数据类型是 [大小]数据类型

var 数组名  [大小]数据类型
var a  [5]int


访问数组元素:数组名[下标]

数组必须要有数组长度,一旦定义度不能修改,不能动态变化,所以数组是值类型
未定义数组长度就是切片了。

B 数组初始化
数组的初始化长度可以事先指定,也可以由初始化的值隐式指定。

var a = [3]int{1, 2, 3}
var s = [2]string{"tom", "kite"}
var b = [2]bool{true, false}

var a = [...]int{1, 2, 3}
s := [...]string{"tom", "kite"}
b := [...]bool{true, false}

var a = [...]int{0: 1, 2: 2}
var s = [...]string{1: "tom", 2: "kite"}
var b = [...]bool{2: true, 5: false}

C 数组的遍历

2.切片slice
A 概述
需要一块内存空间存储相同数据类型的数据集合,但是数据的个数暂且不定。
长度不确定,相同数据类型。
所以切片的的数据类型为:[]数据类型

var 切片名 []类型
var a []int

切片是可变长度数组。未定义长度的数组即为切片。
切片的使用同数组类似。
切片是引用类型,其底层数组结构如下,包含长度和容量。

B 切片初始化
a.直接初始化  
定义一个切片,直接指定具体数组。
s := []int{1, 2, 3}

b.使用数组初始化 
arr := [...]int{1, 2, 3}
s1 := arr[:] 起始值可以省略

arr := [...]int{1, 2, 3, 4, 5, 6}
s1 := arr[2:5]

c.通过make创建切片
var 切片名 []type = make([]type,len,cap)
make的底层创建一个数组,同直接使用数组原理类似。

C 切片的操作
append函数:切片动态追加
copy函数:切片拷贝

~~string与slice


3.关联数组map
定义一块内存存储键值数据集合,数据长度不定。
A 概述
var 变量名 map[type]type
var a map[string]string
var a map[string]map[string]string

~~注意事项
关联数组map是key-value数据结构。
声明不会分配内存,初始化需要用make分配内存,然后才能赋值使用。
a = make(map[string]string,10)
key-value是无序的,每次遍历输出的顺序可能都不同。想要按序输出,则需要将key放入切片中。

B map初始化

C map的增删改查
map["key"] = value 没有key就增加,有key就是修改。
delete(map,"key") 删除key值

查找:

4.容器的常用函数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值