golang工程师面试第一天
**1**.求两个字符串的交集,并写出该程序时间复杂度
```go
package main
import "fmt"
func main() {
str1 :="abcde"
str2 :="cdefg"
/*
将字符串遍历,比较字节相同则输出
*/
for _,v1:=range str1 {
for _,v2:=range str2 {
if v1==v2 {
fmt.Printf(string(v1))
}
}
}
}```
时间复杂度为O(n²)
**2** .未知逻辑运算符优先等级
```go
package main
import "fmt"
/*
未知 && ||逻辑运算优先级
通过代码求优先级
*/
func main() {
a :=true
b :=false
c :=false
if a&&b||c{
fmt.Println("&&优先")
}else {
fmt.Println("||优先")
}
}```
**3**.linux查看被占用端口命令
`lsof -i:port`
**4**.协程线程进程的区别,为什么说协程是轻量级的进程?
**协程** :是一种轻量级的线程,协程的调度完全由用户控制,协程拥有自己的寄存器上下文和栈,当协程调度切换时,将寄存器上下文和栈保存到其他地方,调度切换回来的时候,恢复之前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所有上下文切换非常快。
**线程**:线程是进程的一个实体,是CPU分派和调度的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不用有系统资源,只有一点运行必不可少的资源(程序计数器,寄存器和栈),但是它可以和同属一个进程内的线程共享所拥有的全部资源,线程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。
**进程**:是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位,每个进程都有自己的独立内存空间,进程间通信有多种方法,例如管道,有名管道,信号量,消息队列,信号,共享内存,套接字。由于进程比较重量级,上下文进程间的切换开销较大,但相对稳定安全。
**5**.互斥锁以及什么情况下会死锁
**互斥锁**是传统并发程序对共享资源进行访问控制的手段,在golang中用sync.Mutex定义,其中只有两个公开方法:lock()和Unlock(),前者用于锁定当前互斥量,后者用于对当前互斥量进行解锁。
**死锁的定义**:如果一组进程(或线程)中的每一个进程(或线程)都在等待仅由该组进程中的其他进程(或线程)才能引发的事件,那么该组进程(或线程)是死锁的(Deadlock)。
典型的两种死锁情形:
(一)线程自己将自己锁住
一般情况下,如果同一个线程先后两次调用lock,在第二次调⽤用时,由于锁已经被占用,该线程会挂起等待占用锁的线程释放锁,然而锁正是被自己占用着的,该线程又被挂起而没有机会释放锁,因此 就永远处于挂起等待状态了,于是就形成了死锁(Deadlock)。
(二)多线程抢占锁资源被困
又如线程A获 得了锁1,线程B获得了锁2,这时线程A调用lock试图获得锁2,结果是需要挂起等待线程B释放 锁2,而这时线程B也调用lock试图获得锁1,结果是需要挂起等待线程A释放锁1,于是线程A和B都 永远处于挂起状态了,死锁再次形成。
**产生死锁的必要条件 **
(1)互斥条件。进程(线程)所申请的资源在一段时间内只能被一个进程(线程)锁占用。
(2)请求和保持条件。进程(线程)已经占有至少一个资源,但又提出了新的资源请求,而该资源却被其他进程(线程)占用。
(3)不可抢占条件(不可剥夺条件)。进程(线程)已获得的资源在未使用完之前不能被抢占。
(4)循环等待条件(环路等待条件)。在发生死锁时,必然存在一个进程(线程)—-资源的循环链。
**6**.DNS协议
DNS协议提供DNS解析服务,DNS是域名系统(DomainNameSystem)的缩写,该系统用于命名组织到域层次结构中的计算机和网络服务。域名是由圆点分开一串单词或缩写组成的,每一个域名都对应一个惟一的IP地址,在Internet上域名与IP地址之间是一一对应的,
**7**.数据库事务
**事务**
在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个工作单元操作,要么一个也不执行。
如:网上转帐就是典型的要用事务来处理,用以保证数据的一致性。
**事务特性**
SQL92标准定义了数据库事务的四个特点:
**原子性(Atomicity)**:一个事务里面所有包含的SQL语句是一个执行整体,不可分割,要么都做,要么都不做。
**一致性(Consistency)**:事务开始时,数据库中的数据是一致的,事务结束时,数据库的数据也应该是一致的。
**隔离性(Isolation)**:是指数据库允许多个并发事务同时对其中的数据进行读写和修改的能力,隔离性可以防止事务的并发执行时,由于他们的操作命令交叉执行而导致的数据不一致状态。
**持久性 (Durability)** : 是指当事务结束后,它对数据库中的影响是永久的,即便系统遇到故障的情况下,数据也不会丢失。
一组SQL语句操作要成为事务,数据库管理系统必须保证这组操作的原子性(Atomicity)、一致性(consistency)、隔离性(Isolation)和持久性(Durability),这就是ACID特性。