Go常用类型和函数笔记

Posted 雪狐晨光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go常用类型和函数笔记相关的知识,希望对你有一定的参考价值。

人生忽如寄,莫负茶汤好天气

map、slice、channel这些数据类型本身就是指针类型的,所以就算是拷贝传值也是拷贝的指针,拷贝后的参数仍然指向底层数据结构,所以修改它们可能会影响外部数据结构的值。

make只能构建slice、map和channel这3种结构的数据对象,因为它们都指向底层数据结构,都需要先为底层数据结构分配好内存并初始化。本文将对这三个特殊的结构进行解析。

1. slice

https://www.cnblogs.com/f-ck-need-u/p/9854932.html

Go中的slice依赖于数组,它的底层就是数组,所以数组具有的优点,slice都有,且slice支持可以通过append向slice中追加元素,长度不够时会动态扩展,通过再次slice切片,可以得到得到更小的slice结构,可以迭代、遍历等。实际上slice是这样的结构:先创建一个有特定长度和数据类型的底层数组,然后从这个底层数组中选取一部分元素,返回这些元素组成的集合(或容器),并将slice指向集合中的第一个元素。换句话说,slice自身维护了一个指针属性,指向它底层数组中的某些元素的集合。 每一个slice结构都由3部分组成:容量(capacity)、长度(length)和指向底层数组某元素的指针,它们各占1个机器字长(1个机器字长,64位机器上一个机器字长为64bit,共8字节大小,32位架构则是32bit,占用4字节)。

slice的本质是[x/y]0xADDR,[length/capacity]pointer.

1.1 创建初始化

 

2. channel

 

 

3. map

 

 

4. interface

接口(interface)是一种类型,用来定义行为(方法)。接口类型的数据结构是2个指针,占用2个机器字长。

参考连接:go接口

4.1 接口存储数据结构

 

 

4.2 接口方法集规则

 

 

4.3 接口类型作为参数

 

 

5.  字符串遍历 字节索引 和字符索引


// 使用字节索引需要转换一下
func main() 
	str := "Hello 你好"
	r := []rune(str)  // 8
	for i := 0; i < len(r); i++ 
		fmt.Printf("%c", r[i])
	





// 迭代字符串的时候,是按照字符而非字节进行索引的。
func main() 
	var a = "Xiaofang,你好"
	for index,value := range a 
		println(index,string(value))
	

 

6. 内置函数使用

  • close用于关闭channel
  • delete用于删除map中的元素
  • copy用于拷贝slice
  • append用于追加slice
  • cap用于获取slice的容量
  • len用于获取
    1. slice的长度
    2. map的元素个数
    3. array的元素个数
    4. 指向array的指针时,获取array的长度
    5. string的字节数
    6. channel的channel buffer中的未读队列长度
  • printprintln:底层的输出函数,用来调试用。在实际程序中,应该使用fmt中的print类函数
  • compleximagreal:操作复数(虚数)
  • panicrecover:处理错误
  • newmake:分配内存并初始化
    • new适用于为值类(value type)的数据类型(如array,int等)和struct类型的对象分配内存并初始化,并返回它们的指针给变量。如v := new(int)
    • make适用于为内置的引用类的类型(如slice、map、channel等)分配内存并初始化底层数据结构,并返回它们的指针给变量,同时可能会做一些额外的操作

7.  defer- recover-panic

package main

import "fmt"

func main() 
	println("start main")
	b()
	println("end main")


func a() 
	println("start a")
	panic("panic in a")
	println("end a")


func b() 
	println("start b")
	defer func() 
		if str := recover(); str != nil 
			fmt.Println(str)
		
	()
	a()
	println("end b")

 

 

 

参考文档:

Go slice详解 

以上是关于Go常用类型和函数笔记的主要内容,如果未能解决你的问题,请参考以下文章

golang 接口笔记

go语言学习笔记 — 进阶 — 接口:使用类型分支,批量判断空接口中变量的类型

go语言学习笔记 — 基础 — 高级数据类型 — 派生类型:指针(pointer)数据容器函数(func)结构体(struct)通道(channel)

go语言学习笔记 — 进阶 — 接口(3.1):接口与类型的关系 —— 一个类型可以实现多个接口

go语言学习笔记 — 进阶 — 接口:空接口类型interface{} —— 能保存所有值

go语言学习笔记 — 进阶 — 接口(3.2):接口与类型的关系 —— 多个类型可以实现一个(相同)接口