Go语法易错点

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)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值