const与iota
- iota是常量块的索引,在常量块中每出现一个常量就+1, 遇到const关键字时会被重新置0
const (
a = 1 //a=1 iota=0
b //b=1 iota=1,这是一种简写形式,b的右值等于上一行的右值,即b = 1
c = iota //c=2 iota=2
d //d=3 iota=3,这是一种简写形式,d的右值等于上一行的右值,即d = iota
)
const (
aa = iota //aa=0 iota=0
)
赋值与传参
-
golang中赋值与传参等效,即传参是按值传递,但不同的数据类型会有不同的使用效果
-
非引用类型(值类型):int,float,bool,string,以及数组和struct
特点:变量直接存储值,内存通常在栈中分配,栈在函数调用完会被释放 -
引用类型:指针,slice,map,chan,接口(如context.Context),函数等
特点:变量存储的是一个地址,这个地址存储最终的值。内存通常在堆上分配,当没有任何变量引用这个地址时,该地址对应的数据空间就成为一个垃圾,通过GC回收
//数组
arr1 := [2]int{1,2}
arr2 := arr1 //arr1与arr2是两个不同的数组,为arr2分配内存并将arr1的值复制给arr2
//切片
s1 := []int{1,2}
s2 := s1 //此时s1与s2共用一个底层数组,修改s1将会影响s2
//map
m1 := make(map[string]string)
m2 := m1 //此时m1与m2共用一个底层数据结构,修改m1将会影响m2
接收者
type Person struct {
Name string
}
func (p Person) show1() {
fmt.Println(p.Name)
}
func (p *Person) show2() {
fmt.Println(p.Name)
}
func main() {
p := Person{"Bob"}
f1 := p.show1
f2 := p.show2
p.Name = "Tom"
f1() //打印Bob,函数将会保存接收者的副本
f2() //打印Tom,函数将会保存接收者指针
}
类型别名与新类型
package main
import "fmt"
type MyInt1 int //新类型MyInt1
type MyInt2 = int //MyInt2是int的别名
func main() {
var i int =0
var i1 MyInt1 = i //此句无法通过编译,go是强类型语言
var i2 MyInt2 = i //等价于var i2 int = i
fmt.Println(i1,i2)
}