这是我参与「第三届青训营 -后端场」笔记创作活动的第1篇笔记。
一、变量使用
含义
变量是为存储特定类型的值而提供给内存位置的名称。在go中声明变量有多种语法。
所以变量的本质就是一小块内存,用于存储数据,在程序运行过程中数值可以改变
var名称类型是声明单个变量的语法,以字母或下划线开头,由一个或多个字母、数字、下划线组成。
/**
一、单变量声明
*/
//4、直接声明并赋值
var username string = "changluchanglu"
func Test01(t *testing.T){
//1、指定类型
var name string
name = "name"
//2、自动推断(自动根据值来进行推断)
var name1 = "name1"
fmt.Println(name)
//3、省略var(这种方式只能用在函数体中,不能用在全局变量)
//3.1单个变量赋值时,必须是新变量
name3 := "name3"
//3.2多个变量赋值时,必须有一个时新变量
name1,name2 := "hh","name2"
fmt.Println(name)
fmt.Println(name1)
fmt.Println(name2)
fmt.Println(name3)
fmt.Println(username)
}
二、常量使用
2.1、常量的定义与使用
常量是一个简单值的标识符,在程序运行时,不会被修改的量。
package main
import (
"fmt"
"testing"
)
//1、显示定义(指明类型)
const A string = "abc"
//2、隐式定义(不指明类型)
const B = "abc"
func Test_03_01(t *testing.T){
//多重赋值(函数体中)
const C, D, E = "c","d","e"
fmt.Println(C, D, E) //c d e
const AREA float32 = 5.0
const WIDTH float32 = 6.0
//注意:这里相乘必须是float同一类型
fmt.Println("面积为:", AREA * WIDTH) //面积为: 30
//常量可作为枚举,没有逗号
const (
Unknow = 0
Femal = 1
Male = 2
)
fmt.Println(Unknow, Femal, Male) //0 1 2
//常量可以不指定类型以及初始化值,则与上一行非空常量右值相同
const (
F string = "ff" //指定类型
G //默认与上面类型一致
H = "abc" //直接=
)
fmt.Println(F, G, H) //ff ff abc
}
注意点:
1、常量中的数据类型只可以是布尔型、数字型(整数型、浮点型和复数)和字符串型
2、不曾使用的常量,在编译的时候,是不会报错的。
3、显示指定类型的时候,必须确保常量左右值类型一致,需要时可做显示类型转换。这与变量就不一样了,变量是可以是不同的类型值
2、iota(特殊常量)
iota,特殊常量,可以认为是一个可以被编译器修改的常量
/**
iota特殊常量使用(自增默认是int类型)
*/
//第一个 0,之后会依次递加
const (
a = iota
b = iota
c = iota
)
//第一个 iota 等于 0,每当 iota 在新的一行被使用时,它的值都会自动加 1
//好处:若是我们要定义多组数据按顺序,就可以写多个变量,第一个为iota即可
const (
d = iota
v
z
)
//这里主要就是熟悉一下之前的,当第二个iota出现时,这个值也就是对应从aa到其次数累加1
//bb连上aa+1 dd与cc一致 gg与ff一致 hh连上之前数个+1,ii继续hh+1
const (
aa = iota
bb
cc = "hh"
dd
ff = 100
gg
hh = iota
ii
)
func Test03_02(t *testing.T){
fmt.Println(a, b, c) //0 1 2
fmt.Println(d, v, z) //0 1 2
fmt.Println(aa, bb, cc, dd, ff, gg, hh, ii)//0 1 hh hh 100 100 6 7
}
如果中断iota自增,则必须显式恢复。且后续自增值按行序递增
自增默认是int类型,可以自行进行显示指定类型
数字常量不会分配存储空间,无须像变量那样通过内存寻址来取值,因此无法获取地址
三、基础数据类型
3.1、基本数据类型
快速检索:第3节:基础数据类型
package main
import (
"fmt"
"testing"
)
/**
一、基本类型
*/
//1、布尔类型:只可以是常量true或false
var bbb bool = true
//2、整数类型
var num int = 100
//3、字符串类型
var str string = "123"
func Test_04_01(t *testing.T){
//数据类型转换
//可以自动转型或者手动转型
var strNum = int(num) //例如字符串"100" => 100
fmt.Println(strNum)
}
3.2、 复合类型(派生类型)
/**
二、复合类型
1、指针类型(Pointer)
2、数组类型
3、结构化类型(struct)
4、Channel 类型
5、函数类型
6、切片类型
7、接口类型(interface)
8、Map 类型
*/
四、运算符
算数运算符:+ - * / %(求余) ++ --
关系运算符:== != > < >= <=
逻辑运算符:
运算符 描述
&& 所谓逻辑与运算符。如果两个操作数都非零,则条件变为真
|| 所谓的逻辑或操作。如果任何两个操作数是非零,则条件变为真
! 所谓逻辑非运算符。使用反转操作数的逻辑状态。如果条件为真,那么逻辑非操后结果为假
位运算符:
运算 描述 示例
& 二进制与操作副本位的结果,如果它存在于两个操作数 (A & B) = 12, 也就是 0000 1100
| 二进制或操作副本,如果它存在一个操作数 (A | B) = 61, 也就是 0011 1101
^ 二进制异或操作副本,如果它被设置在一个操作数就是按位取非 (A ^ B) = 49, 也就是 0011 0001
&^ 二进制位清空&^ (A&^B)=48,也就是110000
<< 二进制左移位运算符。左边的操作数的值向左移动由右操作数指定的位数 A << 2 =240 也就是 1111 0000
>> 二进制向右移位运算符。左边的操作数的值由右操作数指定的位数向右移动 A >> 2 = 15 也就是 0000 1111
运算符 描述 示例
= 简单的赋值操作符,分配值从右边的操作数左侧的操作数 C = A + B 将分配A + B的值到C
+= 相加并赋值运算符,它增加了右操作数左操作数和分配结果左操作数 C += A 相当于 C = C + A
-= 减和赋值运算符,它减去右操作数从左侧的操作数和分配结果左操作数 C -= A 相当于 C = C - A
*= 乘法和赋值运算符,它乘以右边的操作数与左操作数和分配结果左操作数 C * = A 相当于 C = C * A
/= 除法赋值运算符,它把左操作数与右操作数和分配结果左操作数 C /= A 相当于 C = C / A
%= 模量和赋值运算符,它需要使用两个操作数的模量和分配结果左操作数 C %= A 相当于 C = C % A
<<= 左移位并赋值运算符 C <<= 2 相同于 C = C << 2
>>= 向右移位并赋值运算符 C >>= 2 相同于 C = C >> 2
&= 按位与赋值运算符 C &= 2 相同于 C = C & 2
^= 按位异或并赋值运算符 C ^= 2 相同于 C = C ^ 2
|= 按位或并赋值运算符 C |= 2 相同于 C = C | 2
有些运算符拥有较高的优先级,二元运算符的运算方向均是从左至右。下表列出了所有运算符以及它们的优先级,由上至下代表优先级由高到低:
优先级 运算符
7 ~ ! ++ --
6 * / % << >> & &^
5 + - ^
4 == != < <= >= >
3 <-
2 &&
1 ||
当然,你可以通过使用括号来临时提升某个表达式的整体运算优先级。
五、键盘打印与输出
输出
fmt包:fmt包实现了类似C语言printf和scanf的格式化I/O。格式化verb(’verb’)源自C语言但更简单。
格式化打印占位符:
%v,原样输出
%T,打印类型
%t,bool类型
%s,字符串
%f,浮点
%d,10进制的整数
%b,2进制的整数
%o,8进制
%x,%X,16进制
%x:0-9,a-f
%X:0-9,A-F
%c,打印字符
%p,打印地址
。。。
import (
"fmt"
"testing"
)
func Test_05_01(t *testing.T) {
a := 100 //int
b := 3.14 //float64
c := true // bool
d := "Hello World" //string
e := "Ruby" //string
f := 'A' //int32
fmt.Printf("%T,%b\n", a, a)
fmt.Printf("%T,%f\n", b, b)
fmt.Printf("%T,%t\n", c, c)
fmt.Printf("%T,%s\n", d, d)
fmt.Printf("%T,%s\n", e, e)
fmt.Printf("%T,%d,%c\n", f, f, f)
fmt.Println("-----------------------")
fmt.Printf("%v\n", a)
fmt.Printf("%v\n", b)
fmt.Printf("%v\n", c)
fmt.Printf("%v\n", d)
fmt.Printf("%v\n", e)
fmt.Printf("%v\n", f)
}