demo已上传git:https://gitee.com/yayako/go-learning.git
变量声明
hello world
fmt.Println("hello wordld") // go中句末无需手动添加分号
fmt包
fmt是go的打印包,相当于java中的System类,区别在于 fmt.Println("fmt", "支持多个入参")
| go | java |
|---|---|
| fmt.Println() | System.out.println() |
| fmt.Print() | System.out.print() |
| fmt.Printf() | System.out.printf() |
其中格式化输出函数 fmt.Printf() 对应的部分指令及其含义如下(摘自 Go语言的格式化输出中%d%T%v%b等的含义
| 格式化指令 | 含义 |
|---|---|
| %% | %字面量 |
| %b | 一个二进制整数,将一个整数格式转化为二进制的表达方式 |
| %c | 一个Unicode的字符 |
| %d | 十进制整数 |
| %o | 八进制整数 |
| %x | 小写的十六进制数值 |
| %X | 大写的十六进制数值 |
| %U | 一个Unicode表示法表示的整型码值 |
| %s | 输出以原生的UTF8字节表示的字符,如果console不支持utf8编码,则会乱码 |
| %t | 以true或者false的方式输出布尔值 |
| %v | 使用默认格式输出值,或者如果方法存在,则使用类性值的String()方法输出自定义值 |
| %T | 输出值的类型 |
变量声明
单变量声明
通过 var 定义
// 声明初始值时数据类型可以省略,会自动推导 -> var a = 1
var a int = 1
// 未声明初始值时数据类型不可以省略,因为无法根据初始值来推导数据类型
var a // ×
var a int // ✔
通过 := 简短定义,只适用于局部变量,全局变量必须使用var来声明
a := 1 // 同样,数据类型会自动推导
需要注意的是,我们知道java只有全局变量即使没有赋予初始值也会在生命周期的准备阶段为其指定默认值,而在go中,即使未声明初始值,也会为其赋予默认值。
多变量声明
通过var声明多个变量
// 通过var在同行声明多个变量的方式限定了所有变量的数据类型必须一致
var a, b int
var a, b = 1, 2
// 该种方式内部的数据类型同样可以省略,且必须有初始值
var (
a int = 1
b string = "2"
)
通过简短定义
a, b := 5, "6"
匿名变量
写作 _,不占用命名空间,因为不会为其分配内存所以匿名变量之间不存在重复声明
假设有一个方法返回了两个结果(go中允许多返回值函数,暂不细谈),而我们只需要使用其中某些结果
// test为一个返回了两个结果的函数
func test(a int, b int) (int, int) {
return a + b, a - b
}
func main() {
// 此处,test函数返回的第二个结果是我们所不需要的,无需为其分配内存,因此可以使用匿名变量
a, _ := test()
_, b := test() // 匿名变量不存在重复声名
}
常量const声明
在idea中尝试输入const并按下回车键,idea会自动为你生成一个java中的常量
private static final int NUM = 235;
在go中的常量则是由 const 关键字定义,一旦赋值就不能改变
// 单常量定义
const k = 0
// 多常量定义,后续相同的可以省略
const (
x = 0 // 0
y = 1 // 1
z // 1
)
常量计数器 iota
go中存在一个常量计数器 iota ,只能在常量的表达式中使用
iota 在const关键字出现时将被重置为0,const中每新增一行常量声明,该值就会自增1,即进行一次计数,也可理解为const语句块中的行索引
const k0 = iota // 0
const (
k1 = iota // 0 —— 在const关键字出现时将被重置为0
k2 // 1 —— 每新增一行常量声明,iota自增
k3 // 2
)
const (
k4 = iota // 0
k5 = 1 // 1
k6 = iota // 2
)
const (
l1, l2 = iota, iota + 1 // 0 1
l3, l4 // 1 2
l5, l6 // 2 3
)
