一、变量的概念
变量,表示内存中的一个存储区域
该区域有自己的名称(变量名)和类型(数据类型)

二、变量的使用步骤
-
声明(定义) 2. 赋值 3. 使用
package main
import (
"fmt"
"strconv"
"unsafe"
)
var myAge int = 19 // 全局变量
func main() {
var age int // 声明
age = 18 // 赋值
fmt.Println(age) // 使用 18
// 2 声明赋值一起
var num int = 19
fmt.Println(num) // 19
// 3 不赋值,变量声明后不赋值,会有默认值比如 int 默认值 0 string 默认值为空串,小数默认为 0
var num2 int
fmt.Println(num2) // 0
// 4 省去类型,根据=后边的值自动推断类型呢
var num3 = 10.25
fmt.Println(num3) // 10.25
// := 最常用
num5 := 222
fmt.Println(num5) // 222
// 多变量一次性定义
var (
n1 = 100
n2 = 200
)
fmt.Println(n1, n2)
fmt.Println(myAge)
// 注意:变量类型不能随意变化(区别于PHP),也不能超出范围
// 变量=变量名+值+数据类型,变量的三要素
// 变量定义了一定要使用,不使用会报错
}
三、go程序中 + 的使用
// + 号的使用
func plus() {
num1 := 10
num2 := 20
num := num1 + num2 // 两边是数值时,是运算符+
fmt.Println(num) // 30
str1 := "我们"
str2 := "来啦"
str := str1 + str2 // 两边是字符串时,拼接符+
fmt.Println(str) // 我们来啦
}
四、go数据类型
基本类型:数值 字符 布尔 字符串
复杂类型:指针 数组 结构体 管道 函数 切片 接口 map
(复习下PHP的数据类型,
基本:布尔型(Boolean)、整型(Integer)、浮点型(Float/Double)、字符串型(String)
复合:数组,对象
特殊:null,资源如:数据库连接)
五、go数据类型-整型
1)有符号
int8 1字节 -128 ~ 127
int16
2
字节 -32768 ~ 32767
Int32
4
字节
-2的31次方(21.4亿) ~ 2的31次方-1
Int64
8
字节 -2的63次方 ~ 2的63次方-1
2)无符号
Uint8 1字节 0 ~ 255
Uint16
2
字节 0 ~ 2的16次方-1
Uint32 4
字节
0 ~ 2的32次方-1
Uint64 8
字节 0 ~ 2的64次方-1
3)其他
Int 32位系统4字节 -2的31次方 ~ 2的31次方-1
64位系统8字节 -2的63次方 ~ 2的64次方-1
Uint 32位系统4字节 -2的32次方 ~ 2的32次方-1
64位系统8字节 -2的64次方 ~ 2的64次方-1
Rune 与int32一样 表示一个unicode码
Byte 无符号 与uint8一样 存储字符时选用byte
4)go中打印数据类型和占用字节
// go中打印数据类型和占用字节
func zijie() {
var n2 int64 = 10
fmt.Printf("n2的类型为 %T 占用字节为 %d", n2, unsafe.Sizeof(n2)) // 8
}
5) bit:
计算机中的最小存储单位。
byte:
计算机中基本存储单元。
1byte = 8 bit
六、数据类型-小数类型/浮点型
-
单精度float32 4字节
-
双经度float64 8字节
-
浮点数都是有符号的
-
浮点数 = 符号位 + 指数位 + 尾数位( 尾数部分可能丢失,造成精度损失。 )
-
float64 的精度比 float32 的要准确
-
浮点型默认声明为 float64 类型
七、数据类型-字符类型
-
Golang 中没有字符类型,存单个字符用 byte 。
-
传统字符串=n个字符连接起来。go字符串=n个byte(字节)连接起来
-
Go字符中只能用单引号
// go数据类型字符
func goByte() {
var c1 byte = 'a' // 按照编码值存储97
var c2 byte = 10
c3 := c1 + c2
fmt.Println(c3) // 107
var c4 int = '北' // 只能单引号不能双引号
fmt.Println(c4) // 21271
fmt.Printf("The character read is: %c\n", c4) // 取出字符 北
}
八、数据类型-布尔类型
-
布尔类型也叫 bool 类型, bool 类型数据只允许取值 true 和 false
-
bool 类型占 1 个字节。
-
bool 类型适于 逻辑运算,一般用于程序流程控制(if for)
// go 数据类型bool
func goBool() {
var v1 bool = true // 值只能是true和false
fmt.Println(v1)
var v3 bool = 5 < 10
fmt.Println(v3)
}
九、数据类型-string类型
-
字符串的两种表示形式
双引号,能识别转义符 str := "双引号\n能识别转义字符”
反引号,原样输出,类似PHP中的单引号
-
字符串的拼接 var str = “hello" + "world"
十、数据类型-默认值
-
整型 0
-
浮点型 0
-
字符串 “”
-
布尔类型 false
// go数据类型默认值
func goVarableDefault() {
var v1 int
var v2 float32
var v3 float64
var v4 bool
var v5 string
fmt.Println("int默认值", v1, "float32默认值", v2, "float64默认值",
v3, "bool默认值", v4, "string默认值", v5)
// int的默认值 0 float32默认值 0 float64默认值 0
// bool默认值 false string默认值
}
十一、数据类型-基本数据类型转换(除srting和bool)
数值 字符 (除bool 字符串)
-
Golang 中数据类型 不能自动转换(区别于PHP)
-
转换公式为 T(v)
-
可从大转小,也可从小转大,值必须在范围内
-
被转换的是变量存储的数据 ( 即值 ) ,变量本身的数据类型并没有变化!
-
转换溢出时不会报错, 按溢出处理,转换时需要考虑范围
int(), int8(),int64(),float32(),float64(),byte()
十二、数据类型-其他类型转string
-
方式 1 : fmt.Sprintf("% 参数 ", 表达式 )
%v 值的默认格式表示
%t 单词true或false
%b 表示为二进制
%c 该值对应的unicode码值
%d 表示为十进制
%f 有小数部分但无指数部分,如123.456
%T 值的类型的Go语法表示
%q 该值对应的单引号括起来的go
语法字符字面值,必要时会
// 其他类型转string
func dataConvertStr() {
var n1 int = 19
var n2 float32 = 4.78
var n3 bool = false
var n4 byte = 'a'
var s1 string = fmt.Sprintf("%d", n1)
fmt.Printf("s1对应的类型是:%T,s1 = %v", s1, s1)
fmt.Println()
var s2 string = fmt.Sprintf("%f", n2)
fmt.Printf("s2对应的类型是:%T,s2 = %v", s2, s2)
fmt.Println()
var s3 string = fmt.Sprintf("%t", n3)
fmt.Printf("s3对应的类型是:%T,s3 = %v", s3, s3)
fmt.Println()
var s4 string = fmt.Sprintf("%c", n4)
fmt.Printf("s4对应的类型是:%T,s4 = %v", s4, s4)
fmt.Println()
}
采用安全的转义表示
-
方式 2 :使用 strconv 包的函数 不好用,不推荐
十二、数据类型-string转其他类型
// 字符串转其他类型
func strToOther() {
//1.string转bool
var s1 string = "true"
var b bool
// 返回字符串表示的 bool 值。它接受 1、0、t、f、T、F、true、false、True、False、TRUE、FALSE;否则返回错误。
b, _ = strconv.ParseBool(s1)
fmt.Println(b)
//2.string转int
var s2 string = "19"
var num1 int64
// 参数1:要转换的字符串,参数2:进制base 2~36, 参数3:bitSize int8,int16。。。
num1, _ = strconv.ParseInt(s2, 10, 64)
fmt.Println(num1)
//2.string转float
var s3 string = "3.14"
var f1 float64
// 参数1:要转换的浮点型字符串,参数2:32或者64
f1, _ = strconv.ParseFloat(s3, 64)
fmt.Println(f1)
var s4 string = "golang"
var b1 bool
b1, _ = strconv.ParseBool(s4)
fmt.Println(b1) // false
var s5 string = "golang"
var num2 int64
num2, _ = strconv.ParseInt(s5, 10, 64)
fmt.Println(num2) // 0
}
十三、复杂类型-指针
1. 普通变量,内存里存的是值和类型
2. 指针变量,指针就是内存地址,地址指向的空间才是值

3. 获取变量地址,&+变量名
// 获取变量地址 &+变量名
func getVarAdd() {
// 普通变量
var n int = 10
fmt.Println(&n) // 0x1400000e140
// 指针变量
var n1 *int = &n // 指针变量,存的是一个地址,地址指向的空间才是值和类型
fmt.Println(n1) // 0x1400000e140
fmt.Println(*n1) // 10
}
4. 指针变量的声明, var ptr *int = &n
5. 获取指针变量指向的值,用 * 如:*n1
6. 值类型都有对应的指针类型,形式
*数据类型 (*int系列 *float系列 *bool *string *数组 *结构体)
十四、值类型和引用类型
1)
值类型:
int
系列
, float
系列
, bool, string
、数组和结构体
struct
2)
引用类型:指针、
slice
切片、
map
、管道
chan
、
interface
等都是引用类型
3)
值类型:变量直接存储值,内存通常在栈中分配

4)
引用类型:变量存储的是一个地址,这个地址对应的空间才真正存储数据
(
值
)
,内存通常在堆
上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾,由
GC
来回收

十五、标识符
凡是自己可以起名字的地方都叫标识符(变量,函数,包)
命名规则
1. 组成部分:数字,字母,下划线_
2. 四个注意:数字不能开头,严格区分大小写,不能有空格,不能用保留关键字
3. 下划线 "_" 本身在 Go 中是一个特殊的标识符,称为空标识符。可以代表任意其他的标识符,但是它对应的值会被忽略 (比如:忽略某个返回值)。所以仅能被作为占位符使用,不能单独作为标识符使用。
4. 包名:尽量保持 package 的名字和目录名一致
,尽量采取有意义的包名,简短,有意义
5.
变量名、函数名、常量名:采用驼峰法
6.
如果变量名、函数名、常量名首字母大写,则可以被其他的包访问,
如果首字母小写,则只能在本包中使用
注意:import 导入语句通常放在文件开头包声明语句的下面。导入的包名需要使用双引号包裹起来,包名是从 $GOPATH/src/ 后开始计算的,使用 / 进行路径分隔。
十六、系统保留关键字/标识符

