type
status
date
slug
summary
tags
category
icon
password
go的变量都是类型在最后的,函数也是这样搞
先从最简单的编写测试程序
首先要确定安装了go,直接在官方那里下载就可以了。
go version判断有无安装成功。
先写第一个程序
注意点:
package main 与文件夹名称无关
- package main 与文件夹名称无关
在 Go 中,package 声明与文件所在的文件夹名称没有直接关系。package 声明是用来组织和重用代码的。
- main 包的特殊性
package main 有特殊的意义:它告诉 Go 编译器这个包应该编译为一个可执行程序,而不是一个库。3. 可执行程序 vs 库
- 如果你正在编写一个可以直接运行的程序,你应该使用 package main。
- 如果你正在创建一个库供其他程序使用,你应该使用其他的包名(通常与文件夹名相同)。
4. main 函数只有 package main 中才能包含 main() 函数,这是程序的入口点。5. 文件夹名称和包名虽然文件夹名称和包名通常是相同的(对于非 main 包),但这不是强制性的。最佳实践是让它们保持一致,以避免混淆。6. 多文件项目在同一个文件夹中的多个 .go 文件应该使用相同的 package 声明。例子:
my_first_go_project/
├── main.go
└── helper.go
在这个例子中,尽管文件夹名为 my_first_go_project,两个文件都声明为 package main,因为它们共同构成一个可执行程序。总结:
- 使用 package main 是因为你正在创建一个可执行程序。
- 文件夹名称不需要与包名匹配,尤其是对于 main 包。
- 如果你later决定创建一个库,你可能会使用与文件夹名称相匹配的包名
运行这个程序有两个方式
1.go run hello.go
2.go build hello.go 然后windows上运行.\hello.exe 或者mac ./hello也能拿到一样的东西
创建更多go文件来测试
比如调用另外一个程序,就确保在同一个目录下,
并且都声明为 package main(如果它们是同一个程序的一部分)。
比如创建了这样的一个下:
这是greetings.go
这是hello.go
go run hello.go greetings.go
来运行就能得到结果
PS D:\go练习\my_first_go_project> go run hello.go greetings.go
What's up,Lu!
然后关于这个运行的指令:
文件顺序灵活性:
- 文件顺序灵活性:
Go编译器会自动处理多个文件之间的依赖关系,所以在大多数情况下,文件的顺序并不重要。
- main 包的识别:
Go会自动识别包含 main() 函数的文件作为程序的入口点,无论它在命令中的位置如何。
- 依赖关系:
虽然编译器会处理依赖,但将包含 main() 函数的文件(通常是 hello.go)放在第一位是一个好习惯,因为它通常是程序的主要入口点。
- 一致性:
保持一致的顺序可以提高代码的可读性,特别是在处理大型项目时。5. 特殊情况:在极少数情况下,如果存在初始化顺序依赖,文件顺序可能会产生影响。但这种情况很罕见,通常应该避免这种设计。总的来说,您可以安全地使用 go run greetings.go hello.go 或 go run hello.go greetings.go,两者应该产生相同的结果。然而,为了清晰和一致性,通常建议将主文件(包含 main() 函数的文件)放在第一位。
第二种的运行方法,就是首先在目录下:
go mod init my_first_go_project
初始化这个目录
然后用go build 之后用.\xxx.exe来运行这个项目的代码
语法
变量
这个例子的话就是可以看到不同的声明变量的方式,感觉这个自动推断类型有点像js的,是不一样的地方。
然后短变量这个就只只能在函数内部使用了。
常用的两种为
var variableName T
和variableName := Value
(简短声明)Go的基本数据类型包括:
- 整数类型:int, int8, int16, int32, int64
- 无符号整数:uint, uint8, uint16, uint32, uint64
- 浮点数:float32, float64
- 复数:complex64, complex128
- 布尔型:bool
- 字符串:string
- 字节:byte(实际上是 uint8 的别名)
- 符文:rune(实际上是 int32 的别名,表示一个Unicode码点)
整数类型后面的数字:
- 整数类型后面的数字:
int8, int16, int32, int64 中的数字表示该类型使用的位数(bits)。例如:
- int8 使用 8 位,可以表示 -128 到 127 的整数
- int16 使用 16 位,可以表示 -32,768 到 32,767 的整数
- int32 使用 32 位,可以表示更大范围的整数
- int64 使用 64 位,可以表示非常大的整数范围
- 无符号整数:
无符号整数(uint)只能表示非负数。它们的类型包括 uint8, uint16, uint32, uint64。
- uint8 可以表示 0 到 255 的整数
- uint16 可以表示 0 到 65,535 的整数
- 以此类推
无符号整数的优点是可以表示更大的正数范围,因为它们不需要用一位来表示正负号。在日常编程中,通常使用 int 和 uint,它们会根据你的系统(32位或64位)自动选择合适的大小。只有在需要精确控制数据大小或与特定硬件交互时,才会使用具体的 int8, int16 等类型。
常量:
常量可以是字符、字符串、布尔值或数值。
基本的控制结构:
for循环
没有while循环
数组和切片
切片类似于java的arraylist,python好像也有这个概念
长度和容量的区别:
长度(Length)
- 定义:切片的长度是指切片当前包含的元素个数。
- 获取方式:使用 len(slice) 函数。
- 意义:表示切片中实际存在的元素数量。
- 特点:可以直接访问的元素范围是从 slice[0] 到 slice[len(slice)-1]。
容量(Capacity)
- 定义:切片的容量是指切片底层数组从切片的第一个元素开始数,可以容纳的元素总数。
- 获取方式:使用 cap(slice) 函数。
- 意义:表示切片在不重新分配内存的情况下可以达到的最大长度。
- 特点:容量总是大于或等于长度。
当我们继续添加元素超过原始容量时,Go 创建了一个新的底层数组,新的容量变为 10(通常是原来的两倍):有点像arraylist的扩容机制
map
结构体
函数
接口