Go语言学习笔记:4. 变量与常量,指针与数组
变量
声明
在Go中这样来声明变量:
var Name Type [ = value] //不指定默认值,默认为零值
var Name = [ = value]
var (
a int = 0
b string = "test"
)
或这样简单的声明,这种方法只能用在函数(或方法)中:
Name := value //自动判断类型
Name1,Name2 := value1,value2
变量类型与命名规则请看上一篇文章。
存储与生存期
Go语言提供自动内存管理,通常不需要特别关注变量的生存期和存放位置。Go使用了栈逃逸技术能为变量自动分配空间:可能在栈上,有可能在堆上。
关于栈逃逸技术:https://studygolang.com/articles/10026
类型转换
在Go中,不同于js之类的语言,不同类型的变量要类型转换:
TypeName(expression) //expression:表达式或变量名
例:
var a int = 1
var b int8 = 2
a = b //非法
a = int(b)
常量
常量中的内容不可改变:
const Name [ = value/iota]
例:
const (Name1 = iota //Name1 = 0
Name2 //Name2 = 1
)
//关于iota请看上一篇文章
指针
Go支持指针,也支持多级指针,指针的声明类型为T(多级:*T),在变量名前加&来获取地址:
var a = 233
b := &a
println(a)
println(b)
println(*b)
//值打印结果
233
0x11f3bfb4 //内存地址
233
又一个例子:
package main
func test(a,b int) *int {
c := a * b //c的作用域在函数内
println(&c)
return &c
}
func main() {
p := test(2,3)
println(p)
}
//打印结果
0x1233bfb8
0x1233bfb8
//Go编译器使用栈逃逸使这种局部变量空间分配到栈上。
由于Go的垃圾回收机制,所以Go不支持指针运算。
数组
声明
var Name [Size]type
例:
arr := [3]int{1,2,3}
arr2 := []int{1,2,3,4,5,6,7} //自动判断长度
arr3 := [3]int{1:1,2:3} //指定默认值,没有指定的使用类型默认值
arr4 := []int{1:2,6:4} //指定判断长度,由最大决定
特性
- 数组一旦创建就固定了,不能再追加元素
- 数组是值类型的,数组赋值或做为函数参数都是值拷贝
- 数组长度是数组的组成部分,[10]int != [20]int
- 可根据数组创建切片
元素访问
a := [...]int{1,2,3}
for index,value := range a {
fmt.Println(value)
}
数组长度
len(Name)
range
Go 语言中 range 关键字用于 for 循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)的元素。在数组和切片中它返回元素的索引和索引对应的值,在集合中返回 key-value 对的 key 值。
其他要说的
字符串运算
参考:
- https://blog.csdn.net/hatlonely/article/details/79156311
- https://www.cnblogs.com/yshyee/p/8810931.html
控制结构
啊?这么快就到for了?