golang经

golang for循环语句
Go也支持传统的写法for i := 0; i < count; i++ {…}。同样,还有一种for i, a := range aa {…}。这个跟Java相比,除了能够遍历,还能得到当前遍历的索引值

静态,动态类型
golang经_第1张图片golang经_第2张图片

go指针不支持+ -运算

go不能类型继承!! 但是能实现多态!! go不支持方法重载!!

defer panic 执行顺序

  • defer是栈,先进后出的顺序
  • panic会在defer执行完成之后执行golang经_第3张图片

main函数

main函数不能带参数

main函数不能定义返回值

main函数所在的包必须为main包

fallthrough用法

  • Go里面switch默认相当于每个case最后带有break,匹配成功后不会自动向下执行其他case,而是跳出整个switch!!
  • 可以使用fallthrough强制执行后面的case代码golang经_第4张图片

命令的作用
go env: #用于查看go的环境变量

go run: #用于编译并运行go源码文件

go build: #用于编译源码文件、代码包、依赖包

go get: #用于动态获取远程代码包

go install: #用于编译go文件,并将编译结构安装到bin、pkg目录

go clean: #用于清理工作目录,删除编译和安装遗留的目标文件

go version: #用于查看go的版本信息

Printf()、Sprintf()、Fprintf()函数的区别用法是什么?

  • Sprintf(),是把格式字符串输出到指定字符串中,所以参数比printf多一个char*。那就是目标字符串地址。golang经_第5张图片
  • Printf(),是把格式字符串输出到标准输出(一般是屏幕,可以重定向)
  • Fprintf()是格式化输出到一个stream,通常是到文件。所以参数比printf多一个文件指针FILE*。主要用于文件操作

new make区别

  • make只用于内建类型(map、slice 和channel)的内存分配。new用 于各种类型的内存分配。
  • new返回指针
  • make只能创建slice、map和channel,并且返回一个有初始值(非零)的T类型,而不是*T

什么是golang

  • Go语言是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能
  • Go并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能,但增加了 切片(Slice) 型、并发、管道、垃圾回收、接口等特性的语言级支持

比较两个slice,struct,map是否相等

  • reflect.DeepEqualgolang经_第6张图片

linux命令

  • 查看cpu负载,内存占用: top
  • 如何发送信号给一个进程:kill命令

golang slice切片(动态数组)

  • 数组是类型相同的元素的集合

  • var variable_name [SIZE] variable_type 声明数组 var a [3]int 或者 a := [3]int{12, 78, 50}

  • golang 提供简单的遍历数组的方式 for i, v := range a

  • 切片(slice)是建立在数组之上,切片并不存储任何元素而只是对现有数组的引用。切片本身不包含任何数据。它仅仅是底层数组的一个上层表示。对切片进行的任何修改都将反映在底层数组中。

  • 通过 a[start:end] 这样的语法创建了一个从 a[start] 到 a[end -1] 的切片golang经_第7张图片

  • 内置函数 func make([]T, len, cap) []T 可以用来创建切片,该函数接受长度和容量作为参数在这里插入图片描述

  • 切片是动态的,可以使用内置函数 append 添加元素到切片。append(s []T, x …T) []T
    golang数组与切片的区别

  • golang经_第8张图片

golang Context包作用

  • golang可以很方便创建协程goruntine,但是怎么控制这些协程呢?通过context包,当这个请求超时或者被终止的时候,context优雅地退出所有衍生的 goroutine,并释放资源
  • 流程
    golang经_第9张图片
  • context包函数
  • golang经_第10张图片
  • Done 要配合 select 语句使用
  • 有两种方法创建根Context:context.Background() context.TODO()根 context 不会被 cancel。这两个方法只能用在最外层代码中,一般使用 Background() 方法创建根 context。
  • 一个 Context 被 cancel,那么它的派生 context 都会收到取消信号(表现为 context.Done() 返回的 channel 收到值)。
    有四种方法派生 context :golang经_第11张图片
    例子,主协程执行cancel()后,子context的Done()收到消息,执行退出
    golang经_第12张图片

select可以用于什么
golang 的 select 就是监听 IO 操作,当 IO 操作发生时,触发相应的动作
每个case语句里必须是一个IO操作,确切的说,应该是一个面向channel的IO操作

golang是强类型弱类型

静态类型:编译时就确定类型,java/C/C++/golang

动态类型:运行时确定 python/PHP

强类型:类型是定义好的,无法改变它的类型了,但是向C语言,虽然定义了一个short,还是可以当成char来用的,因为可以直接操作内存。

弱类型:类型之间可以自由转换

golang 数据竞争检测 DATA RACE

  • Golang中我们使用Channel或者sync.Mutex等锁保护数据,有没golang有一种机制可以检测代码中的数据竞争 go run -race hi.gogolang经_第13张图片

golang GC 三色标记清除法

  • Golang的GC算法主要是基于 标记-清扫(markandsweep)算法,并在此基础上做了改进,标记清除法在整个执行时要求长时间stop the world,需要程序暂停,也就是说,这段时间程序会卡在哪儿
  • 通常小对象过多会导致GC三色法消耗过多的GPU。优化思路是,减少对象分配.
  • Golang的三色标记法的大体流程。golang经_第14张图片golang经_第15张图片golang经_第16张图片

golang经_第17张图片golang经_第18张图片

golang中的csp模型
CSP模型是上个世纪七十年代提出的,不同于传统的多线程通过共享内存来通信,CSP讲究的是“以通信的方式来共享内存”。用于描述两个独立的并发实体通过共享的通讯 channel(管道)进行通信的并发模型。 CSP中channel是第一类对象,它不关注发送消息的实体,而关注与发送消息时使用的channel。
’和"区别
''是单个字符 ""里面是字符串

golang经_第19张图片

*和&区别

  • 变量a 在cpu代表一个存储单元,a代表存储单元所存的数据,&a就是该存储单元在cpu 的地址
  • 如果a存储的数据是另一个存储单元的地址.a=&b ,则 *a的值就是另一个存储单元的值, * a=b

定义全局变量只能是 func import type var const
golang经_第20张图片

你可能感兴趣的:(面试)