golang初学(一)

==推荐使用Goland编辑器!
看我这行命令生成.mod 文件

go mod init demo

1、go文件编译可分为两种,一种先执行go build然后在运行xxx.exe文件,另一中则是直接执行go run直接进行编译输出结果。两种编译方式区别在于先执行go build我们把生成的编译文件放到任何一台机器上都可以执行,但是go run则需要安装go环境。如果想要执行出自己想要的文件名称执行go build -o xxx xxx.go即可。
2、go 应用程序入口为main函数,并且严格区分大小写,就跟windows编译不区分大小写,但是到了linux就会严格区分大小写。go编译器是一行行进行编译,所以我们不能把多条语句写在同一行。
在这里插入图片描述
导入的import包如果不使用就会编译不通过,编辑器监测到你没有使用会马上删掉引入的包。声明的变量必须使用,否则编译报错等等大量的语言风格。
3、Go语言转义字符
\t : 制表位,实现对齐的功能
\n: 换行符
\ : 一个
\“ : 一个”
\r :回车会覆盖前边的内容
4、养成良好的注释习惯!!!推荐一个go语言中文网

为什么需要变量

5、变量介绍:变量相当于内存中一个数据储存的空间表示,可以把变量看作是一个房间的门牌号,通过门牌号我们可以找到房间,同样道理通过变量名可以访问到变量。
变量使用->声明变量、赋值、使用
变量=变量名+值+数据类型(各个数据类型都有默认值)

var name string
name="小明"
fmt.println(name)

1)变量表示内存中的一个储存变量 2)该区域有自己的名称和类型
3)变量的使用方式:第一种:指定变量类型,声明后若不赋值,使用默认值
第二种:根据值自行判定变量类型
第三种:省略var,注意:=左侧的变量不应该是已经声明过的,否则会导致编译错误
4)多变量声明:在编译中有时我们需要一次性声明多个变量,golang也提供这样的语法。

	var (
	name string
	age  int
	)

6、数据类型
1)基本数据类型–> 数值型:整数类型 int int8 int 16 int32 int64 uint uint8 uint16 uint32
uint64 byte
浮点类型 float32 float64
字符型
布尔型 bool
字符串 string
2)复杂数据类型–>指针 Pointer 数组 结构体 struct 管道 channel 函数 func 切片 slice 接口 interface map
7、map的理解取模+拉链法—基本存储原理
1)在存储数据时把键值对的键进行哈希算法进行计算,然后进行取模,最后把键值对存在相应的取模余数位置,如果取模余数相同,即可通过链表式方法同样存在相同的位置但不在一个表内。map
2)map的特点:键不能重复
键必须可哈希 (int\bool\float\string\array)
无序
2、初始化

	// 初始化
	// userInfo :=map[string]string{}
	userinfo := map[string]string{"name":"sad","age":"22"}
	fmt.Println(userinfo["name"])
	userinfo["age"]="20"
	userinfo["email"] = "123@123.com"
	fmt.Println(userinfo)
	data := make(map[string]int,10)
	data["100"] = 100
	data["200"] = 200
	fmt.Println(len(data))
	var row map[string]int
	//row["name"] =1 会出现编译报错
	fmt.Println(row)

	// value 是个指针
	value := new(map[string]int)
	//value["key"]=1 会出现编译报错
	fmt.Println(&value)
	value = &data
	fmt.Println(value)
	v1 := make(map[[2]int] float32)
	v1[[2]int{1,1}] = 1.2
	// 打印结果
	//sad
	//map[age:20 email:123@123.com name:sad]
	//2
	//map[]
	//0xc00000e038
	//&map[100:100 200:200]

2)map 常用操作
(1)、长度


   data := map[string]string{"n1":"11"}
   val := len(data)
   fmt.Println(val)

   // 根据容量的值,计算出合适的容量
   // 一个map中会包含很多容器,每个容器中可以存在8个键值对
   info := make(map[string]string,10)
   info["n1"] = "11"
   v1 :=len(info)
   fmt.Println(v1)
   // 2
   //v2 :=cap(info)  会报错不支持map计算

(2)crud、

data := map[string]string{"n1":"111"}
   data["n3"] = "222"
   data["n1"]="1"
   delete(data,"n2")
   fmt.Println(data["n1"])

(3) 变量赋值

// 变量赋值
	v1 :=map[string]string {"n1":"1"}
	v2 :=v1
	v1["n1"] = "22"
	fmt.Println(v1)//map[n1:22]
	fmt.Println(v2)//map[n1:22]
	// 特别提醒 :无论是否存在扩容都指向同一个地址。
  1. Map 底层原理剖析
    Golang中的Map有自己的一套实现原理,其核心是由hmap和bmap两个结构体实现。

3.1、读取数据

   value:= info["name"]

在map中读取数据时,内部的执行流程为:
·第一步 :结合哈希因子和键name生成哈希值,
·第二部 :获取哈希值后b位,并根据后b位的值来决定此键值对存放在那个桶中(bmap)
·第三步 :确定桶之后,再根据key的哈希值计算出tophash(高8位),根据tophash和key去桶中查找数据。
如果当前桶没有找到,则根据overflow再去溢出桶中寻找,均未找到则表示key不存在。
3.2、扩容
条件:
map中数据总个数/桶个数>6.5,引发翻倍扩容。
使用了太多的溢出桶时(溢出桶使用的太多会导致map处理速度降低)
b<=15,已使用的溢出桶个数>=2的b次方,引发等量扩容,
b>15,已使用的溢出桶个数>=2的15次方,引发等量扩容。
···
3.3迁移
翻倍扩容:
如果是翻倍扩容,那么迁移规则就是将旧桶中的数据分流至两个桶中(比例不确定),并且桶编号的位置为,同编号位置和翻倍后对应编号位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值