深信服
[TOC]
深信服笔试
考察golang语法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
package main
import (
"fmt"
)
func Add(list []int, e int) {
_ = append(list, e)
}
func main() {
var list []int
Add(list, 1)
list = append(list, 21)
fmt.Println(list)
}
/*
PS D:\ASUS\Desktop\temp\golang学习\client> go run .\example.go
[21]
PS D:
只会打印 21
*/
|
考察引用传递和数组传递
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package main
import (
"fmt"
)
//list1 是 切片,所以是引用
//list2 是数组,所以是全值
func main() {
var list1 []int = []int{2, 1}
var list2 [10]int
c := list1
d := list2
c[0] = 99
d[0] = 99
fmt.Println(list1)
fmt.Println(list2)
}
/*
PS D:\ASUS\Desktop\temp\golang学习\client> go run .\example.go
[99 1]
[0 0 0 0 0 0 0 0 0 0]
*/
|
一面
golang等待其他协程执行完成
golang 等待一组协程退出
问我要用到哪些包
sync/atomic
, time
, sync
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import (
"log"
"sync"
"sync/atomic"
"time"
)
func main() {
wg := sync.WaitGroup{}
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
log.Println(i)
wg.Done()
}(i)
}
wg.Wait()
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import (
"log"
"time"
)
func main() {
ch := make(chan struct{}, 10)
var i int
for i = 0; i < 10; i++ {
go func(i int) {
log.Println(i)
ch <- struct{}{}
}(i)
}
for j := i; j > 0; j-- {
<-ch
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
package main
import (
"log"
"time"
)
func main() {
ch := make(chan struct{})
for i := 0; i < 10; i++ {
go func(i int) {
log.Println(i)
ch <- struct{}{}
}(i)
<-ch
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
package main
import (
"log"
"time"
"sync"
"sync/atomic"
)
func main() {
var total int32
for i := 0; i < 10; i++ {
go func(i int) {
log.Println(i)
atomic.AddInt32(&total,1)
}(i)
}
for atomic.LoadInt32(&total) < 10 {
time.Sleep(time.Microsecond)
}
}
|
golang G-M-P 模型
面试官: 聊聊 golang 的 GMP 模型
我: 不会。。
面试官: 你java 学的多一点吧? 问几个 java的问题吧。
G:Goroutine
M: OS Thread
P:抽象概念(Processor),类似cpu的作用,将G调度到M上,进行绑定
所有的 P 都在程序启动时创建,并保存在数组中,最多有 GOMAXPROCS(可配置) 个
b站找到的学习教程
java 的 地址比较
1
2
3
4
5
6
7
8
|
@Test
void printIt() {
Double i1 = 1.0;
Double i2 = 1.0;
Double i3 = 1.0;
System.out.println(i1 == i2);
System.out.println(i1 == i3);
}
|
答案全部都是 false,全部比较地址,并且没有 Integer那种 对象池
自增的一些原理
1
2
3
4
5
6
7
|
@Test
void printIt() {
short i = 1;
i+=1;
i = (short)(i+1);
}
|
i+=1 会自动转型, i = i+1 ,就要手动向下转型。
学了这么久,都没意识到这个
实现最小栈
算法题:数组 sum 等于0 的元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#include<bits/stdc++.h>
using namespace std;
int main(void) {
vector<int> v= {-1, 0, 1, 2,2,1,1,2,2,4,6, -1, -4};
sort(v.begin(),v.end());
vector<vector<int>>res;
int n = v.size();
int pre1 = -7777;
int pre2 = -9999;
for(int i=0;i<n;i++) {
int j = i+1, r = n-1;
while(j<r) {
int a= v[i],b = v[j] , c= v[r];
int sum = a+b+c;
if(res.size() && pre1==a && pre2 == b && sum == 0){
++j;
continue;
}
if(sum == 0) {
pre1 = a;
pre2 = b;
++j;
res.push_back({a,b,c});
}else if(sum > 0) {
--r;
}else {
++j;
}
}
}
for(int i=0;i<res.size();++i) {
cout << res[i][0] <<" " << res[i][1]<<" " << res[i][2] <<endl;
}
}
|