1-出现死锁
package main
import (
"sync"
"sync/atomic"
)
func main() {
var wg sync.WaitGroup
ans := int64(0)
for i := 0; i < 3; i++ {
wg.Add(1)
go newGoRoutine(wg, &ans)
}
wg.Wait()
}
func newGoRoutine(wg sync.WaitGroup, i *int64) {
defer wg.Done()
atomic.AddInt64(i, 1)
return
}
2-Select
select机制用来处理异步IO问题(正确) select机制最大的一条限制就是每个case语句里必须是一个IO操作(正确) golang在语言级别支持select关键字(正确) select关键字的用法与switch语句非常类似,后面要带判断条件。(错误)
虽然Select 后面有 case 但是不是判断条件,而是一个IO操作。
// 使用 select 语句监听多个通道,等待响应结果
for i := 0; i < len(urls); i++ {
select {
case result := <-respChan:
fmt.Println(result)
case <-time.After(time.Second * 6):
fmt.Println("Timeout")
return
}
}
3-GoVender
无法精确的引用外部包进行版本控制,不能指定引用某个特定版本的外部包;只是在开发时,将其拷贝过来,但是一旦外部包升级,vendor下的代码不会跟着升级,
而且vendor下面并没有元文件记录引用包的版本信息,这个引用外部包升级产生很大的问题,无法评估升级带来的风险;
4-类型转化
type MyInt int
var i int= 1
var j MyInt =i
(错误)
type MyInt int
var i int= 1
var j MyInt = MyInt(i)
(正确)
5-取返
在 Go 语言中,取反操作使用 ! 运算符。! 运算符用于对布尔型表达式取反,其结果是一个布尔型值。
例如,假设有一个布尔型变量 b,可以使用 !b 表达式对其取反。如果 b 的值为 true,则 !b 的值为 false;如果 b 的值为 false,则 !b 的值为 true。
除了布尔型表达式外,! 运算符还可以用于整型和浮点型数据的取反。在这种情况下,! 运算符会将整型和浮点型数据转换为布尔型数据,然后对其取反。如果整型或浮点型数据为 0,则取反结果为 true;否则为 false。
6-const
const a float64 = 3.142142
const zero = 0.0
「正确」
const (
size int64 =1024
eof = -1
)
「正确」
const (
ERR_ELEM_EXIST error = errors.New("exist")
ERR_ELEM_NOT_EXIST error = errors.New("not exist")
)
「错误」
go语言常量要是编译时就能确定的数据,C选项中errors.New(“xxx”) 要等到运行时才能确定,所以它不满足
7-赋值
var x = nil--------错误
var x interface{} = nil -------正确
var x string = nil --------错误
var x error = nil-------正确
nil只能赋值给channel,slice,map,指针,func和interface,即五大引用类型和指针
8-Channel
var ch chan int ----声明正确
ch := make(chan int)----声明正确
<- ch ----可以单独写,可以单独调用获取通道的(下一个)值,当前值会被丢弃,但是可以用来验证
ch <- 不可以单独写,往 ch中放值,应该在箭头的末端有对应的值。
9-this 指针
「方法施加的对象显式传递,没有被隐藏起来」在 Go 语言中,方法不依赖于隐式的 this 指针,而是将方法的接收者(Receiver)作为一个显式参数传递。在函数体内,可以通过接收者来访问相应的对象。例如,假设有一个结构体类型 Person,其中包含一个名为 name 的字段,以及一个名为 SayHello 的方法:
type Person struct {
name string
}
func (p Person) SayHello() {
fmt.Printf("Hello, my name is %s\n", p.name)
}
10-可以给任意类型添加相应的方法「错误」
内置类型是可以定义,但指针类型是不能被定义的.
11-json.Marshal
package main
import (
"encoding/json"
"log"
)
type S struct {
A int
B *int
C float64
d func() string
e chan struct{}
}
func main() {
s := S{
A: 1,
B: nil,
C: 12.15,
d: func() string {
return "NowCoder"
},
e: make(chan struct{}),
}
_, err := json.Marshal(s)
if err != nil {
log.Printf("err occurred..")
return
}
log.Printf("everything is ok.")
return
}
尽管标准库在遇到管道/函数等无法被序列化的内容时会发生错误,但因为本题中 d 和 e 均为小写未导出变量,因此不会发生序列化错误
12-关于main函数(可执行程序的执行起点),下面说法正确的是() main函数不能带参数「正确」 main函数不能定义返回值「正确」 main函数所在的包必须为main包「正确」
13-自增
正确
i:=1 i++
错误
i:=1 j=i++
错误
i:=1 ++i
正确
i:=1 i--
14-Beego
beego并不是轻量级。beego提供了许多路由注册的方式。 bee工具可以帮助开发者使用beego,创建和运行beego项目等。 beego有自带的orm,简化开发者的数据库操作。
15-错误设计
如果失败原因只有一个,则返回bool
如果失败原因超过一个,则返回error
如果没有失败原因,则不返回bool或error
如果重试几次可以避免失败,则不要立即返回bool或error
16-Append
正确
var s []int a= append(s,1)
正确
var s []int =[]int{} a= append(s,1)
17-关于GoStub,下面说法正确的是
A「正确」
GoStub可以对全局变量打桩
B「正确」
GoStub可以对函数打桩
C「错误」
GoStub可以对类的成员方法打桩
D「正确」
GoStub可以打动态桩,比如对一个函数打桩后,多次调用该函数会有不同的行为
选项错误,GoStub 不支持对类的成员方法进行打桩。在 Go 语言中,没有类的概念,而是使用结构体(Struct)来实现面向对象编程。因此,GoStub 只能对结构体中的方法进行打桩,不能对类的成员方法进行打桩。
GoStub 是一个 Go 语言的测试框架,用于在单元测试中对函数进行打桩(Stub)。打桩是一种模拟测试技术,在测试时可以用虚拟的函数代替真实的函数,从而控制函数的行为和输出结果,以便更好地测试代码的正确性。 GoStub 可以对全局变量进行打桩。在测试中,可以用虚拟的全局变量代替真实的全局变量,从而控制全局变量的值和输出结果。 GoStub 可以对函数进行打桩。在测试中,可以用虚拟的函数代替真实的函数,从而控制函数的行为和输出结果。
func DoSomething() int {
// ...
}
func TestSomething(t *testing.T) {
// 第一调用返回1
stub.When(DoSomething).Return(1).Once()
assert.Equal(t, 1, DoSomething())
// 第二次调用返回2
stub.When(DoSomething).Return(2).Once()
assert.Equal(t, 2, DoSomething())
// 后续调用全部返回0
stub.When(DoSomething).Return(0).Do()
}
18-字符串
GO语言中字符串是不可变的,所以不能对字符串中某个字符单独赋值。
s:="Hello"
s[0]="x"
fmt.Println(s)
// "Hello"
19-布尔类型赋值
错误。第一行,b没有指定类型,不能直接赋值整型1。第二行,Go没有bool()函数
b = 1 b = bool(1)
20-Cap的适用范围
arry:返回数组的元素个数 slice:返回slice的最大容量 channel:返回channel的buffer容量
21-切片的初始化
正确
s := make([]int, 0) s := make([]int, 5, 10) s := []int{1, 2, 3, 4, 5}
错误
s := make([]int)
22-GoMock
正确
GoMock可以对interface打桩 GoMock打桩后的依赖注入可以通过GoStub完成
错误
GoMock可以对类的成员函数打桩 GoMock可以对函数打桩
https://leetcode-cn.com/contest/weekly-contest-232/problems/maximum-average-pass-ratio/
https://segmentfault.com/a/1190000016611415
https://juejin.cn/post/6844903635046924296
https://blog.csdn.net/a745233700/article/details/88088669
https://juejin.cn/post/6844903653195644936
https://segmentfault.com/a/1190000021199728
https://imageslr.com/2020/02/27/select-poll-epoll.html
https://draveness.me/whys-the-design-tcp-time-wait/
https://draveness.me/whys-the-design-https-latency/
https://www.zhihu.com/question/29270034/answer/46446911
https://juejin.cn/post/6844904097733165069
https://zhuanlan.zhihu.com/p/25600743
https://juejin.cn/post/6844903895227957262
https://www.jianshu.com/p/4491cba335d1
https://juejin.cn/post/6844903848587296781#heading-8
https://mp.weixin.qq.com/s/x5F6AjkWgeSP2Jd5iDyvOg
https://www.zhihu.com/question/65502802
http://www.tastones.com/stackoverflow/bosun/getting-started-with-bosun/
https://www.zhihu.com/question/21923021
https://www.runoob.com/w3cnote/quick-sort.html
https://juejin.cn/post/6844903648670007310
https://github.com/wolverinn/Waking-Up
https://www.programiz.com/dsa
https://github.com/CyC2018/cs-notes
https://willshang.github.io/go-leetcode/docs/source/go/1-go%E8%AF%AD%E8%A8%80acm%E5%88%B7%E9%A2%98%E8%BE%93%E5%85%A5%E9%97%AE%E9%A2%98.html
https://juejin.cn/post/6886321367604527112
https://juejin.cn/post/6968311281220583454
https://developer.aliyun.com/article/777750
https://blog.51cto.com/u_14813744/2718736
http://c.biancheng.net/view/3453.html
https://juejin.cn/post/6858619792157638670
https://www.qtmuniao.com/2021/12/07/cuckoo-hash-and-cuckoo-filter/
https://golang.design/go-questions/channel/close/
https://zhuanlan.zhihu.com/p/66768463
https://segmentfault.com/a/1190000038973775
https://github.com/xingshaocheng/architect-awesome/blob/master/README.md#%E5%A0%86%E6%8E%92%E5%BA%8F
https://pdai.tech/