一,变量和常量
1,变量的声明
声明格式: var 变量名 变量类型
var name string
name = "小明"
fmt.Println(name)
批量声明:
var age,height int8 //变量类型相同
age = 18
height = 170 //constant 170 overflows int8
var ( //类型变量不同
a string
b int
c bool
d float32
)
声明并赋值:
hobby := "打篮球"
程序自动判断:
var teacher = "李小龙"
var name,age = "小李" , 18
注意事项:
- 变量声明的时候会在变量对应的内存区域进行初始化操作,每个变量会生成该变量所属类型的一个初始默认值,例如:整形和浮点型:0;字符串:空字符串;布尔类型默认值为:false;切片,函数,指针变量默认为nil
- 变量声明之后要使用,如果不使用则会报错
- 字符串可用双引号 " " ,或者 反引号 ` ` 表示,不可以用单引号。但是反引号不支持转义(例如\n转义为换行),而是直接输出 \n
- 在函数的外部,声明变量必须用 var 关键字,而不能用
:=
的方法声明
2,匿名变量(anonymous variable)
- 匿名变量不占用命名空间,不分配内存,所有匿名变量不存在重复声明
- 我们常用匿名变量,表示要忽略掉(不使用)该变量
- 我们只执行包的初始化,但是不使用包,也应用到匿名变量
func foo() (int, string) {
return 10, "Q1mi"
}
func main() {
x, _ := foo()
_, y := foo()
fmt.Println("x=", x)
fmt.Println("y=", y)
}
3,常量
常量定义之后,在整个程序的运行中,都保持不变。常量的定义与变量类似,只是把 var
关键字换成 const
关键字 就可以了
const pi = 3.1415
const e = 2.7182
二,打印输出
golang的打印输出依赖:fmt包 import ("fmt" )
- fmt.Println() 打印并换行
- fmt.Printf() 格式化输出
- 查看变量类型用reflect.TypeOf()
type Cat struct{
length int8
color string
skill string
}
kitty := Cat{
length : 5,
color : "orange",
skill : "catch mouse",
}
fmt.Println(kitty) // {5 orange catch mouse}
fmt.Printf("kitty是:%v \n",kitty) // %v是默认的占位符:kitty是:{5 orange catch mouse}
fmt.Printf("kitty是:%+v \n",kitty) // %+v会打印键值对: kitty是:{length:5 color:orange skill:catch mouse}
fmt.Printf("kitty是:%#v \n",kitty) // %#v会打印类型+键值对: kitty是:main.Cat{length:5, color:"orange", skill:"catch mouse"}
var teacher = "李小龙"
fmt.Println(reflect.TypeOf(teacher)) // string 查看变量类型
fmt.Println(reflect.TypeOf(kitty)) //查看变量类型:main.Cat
参考文章:https://studygolang.com/articles/20310
1,通用占位符:
v 值的默认格式。
%s 输出字符串表示(string类型或[]byte)
%+v 添加字段名(如结构体)
%% 字面上的百分号,并非值的占位符
2,整数占位符:
%b 二进制表示
%d 十进制表示
%x 十六进制表示
3,浮点数及复数:
%b 无小数部分的,指数为二的幂的科学计数法,与 strconv.FormatFloat中的 'b' 转换格式一致。例如 -123456p-78
%f 有小数点而无指数,例如 123.456
4,指针:
%p 十六进制表示,前缀 0x
fmt.Printf("%p \n",&kitty) // 0xc000070330
三,命令行
- 在命令行执行:
go
会列出所有命令 - 在命令号执行:
go help + 命令
可以获得帮助
常用命令有:
go version 查看版本
go env用于打印Go语言的环境信息。
go run命令可以编译并运行命令源码文件。
go get可以根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包,并对它们进行编译和安装。
go build命令用于编译我们指定的源码文件或代码包以及它们的依赖包。
go install用于编译并安装指定的代码包及它们的依赖包。
go clean命令会删除掉执行其它命令时产生的一些文件和目录。
go doc命令可以打印附于Go语言程序实体上的文档。我们可以通过把程序实体的标识符作为该命令的参数来达到查看其文档的目的。
go test命令用于对Go语言编写的程序进行测试。
go list命令的作用是列出指定的代码包的信息。
go fix会把指定代码包的所有Go语言源码文件中的旧版本代码修正为新版本的代码。
go vet是一个用于检查Go语言源码中静态错误的简单工具。
go tool pprof命令来交互式的访问概要文件的内容。
三,变量的复制,引用,指针变量
&
符号在go中是取内存地址的意思, &a
就是获取变量a的内存地址
1,变量的赋值是值传递
var age int8 = 18
fmt.Println(age) // 18
fmt.Println(&age) // 0xc0000120a0
var age1 int8 = age
fmt.Println(age1) // 18
fmt.Println(&age1) // 0xc0000120b6 可以发现age与age1的地址空间并不相同
2,指针
var age int = 18
fmt.Println(&age) // 0xc0000120a0
var agePoint *int //解析:agePoint 是一个指针变量,int是指该指针变量的类型,*表示该变量(agePoint)是一个指针变量
fmt.Println(agePoint) // nil,当一个指针被定义后没有分配到任何变量时,它的值为 nil。
//*agePoint = 1 //报错,原因:我们定义一个指针(agePoint),指针分配了地址(指针地址),但是指针指向的值(*agePoint)还没有分配到地址
//fmt.Println(*agePoint) //报错,原因:与上相同,只分配了指针地址,还没分配 值 地址
agePoint = &age
fmt.Println(*agePoint) // 18
fmt.Println(agePoint) // 0xc0000120a0 可见,与age变量的内存地址是一样的
*agePoint = 29
fmt.Println(age) // 29 可见,改变 *agePoint,age也会一同改变
上面代码中:
- var age 是一个int类型的值,而 var agePoint 是一个指针
- *agePoint 是一个值
- 用
&
可以取到某个变量的内存地址,这个内存地址可以赋值给一个指针变量 - 改变 *agePoint,age也会一同改变,因为这两个变量的值,存放在:相同的内存地址
3,接收指针的函数
func main() {
var myAge int8 = 18
var yourAge int8 = 28
changeEachOther(&myAge,&yourAge)
fmt.Println(myAge) // 28
fmt.Println(yourAge) // 18
}
//交换两个变量的值
func changeEachOther(x *int8,y *int8) {
fmt.Println(x) // x是一个内存地址,0xc0000120a0,其实 x 就是 &myAge
fmt.Println(*x) // *x是&myAge内存地址里面的值,18
var temp int8 = *x
*x = *y
*y = temp
}
4,传值与传引用
- 参考博文:https://blog.csdn.net/cyk2396/article/details/78893828
-
var b = a
如果b的修改不会改变a的值,那么是传值;否则,是传引用
四,内置类型和函数:
1,内置类型--值类型:
bool
int(32 or 64), int8, int16, int32, int64
uint(32 or 64), uint8(byte), uint16, uint32, uint64
float32, float64
string
complex64, complex128
array -- 固定长度的数组
2,引用类型(指针类型)
slice -- 序列数组(最常用)
map -- 映射
chan -- 管道
3,内置函数
Go 语言拥有一些不需要进行导入操作就可以使用的内置函数。它们有时可以针对不同的类型进行操作,例如:len、cap 和 append,或必须用于系统级的操作,例如:panic。因此,它们需要直接获得编译器的支持。
append -- 用来追加元素到数组、slice中,返回修改后的数组、slice
close -- 主要用来关闭channel
delete -- 从map中删除key对应的value
panic -- 停止常规的goroutine (panic和recover:用来做错误处理)
recover -- 允许程序定义goroutine的panic动作
real -- 返回complex的实部 (complex、real imag:用于创建和操作复数)
imag -- 返回complex的虚部
make -- 用来分配内存,返回Type本身(只能应用于slice, map, channel)
new -- 用来分配内存,主要用来分配值类型,比如int、struct。返回指向Type的指针
cap -- capacity是容量的意思,用于返回某个类型的最大容量(只能用于切片和 map)
copy -- 用于复制和连接slice,返回复制的数目
len -- 来求长度,比如string、array、slice、map、channel ,返回长度
print、println -- 底层打印函数,在部署环境中建议使用 fmt 包