怎样在自己网站上传产品,上海当地网站,网站设计目标 优帮云,网站到期只续域名不续空间能打开吗Golang开发新手常犯的50个错误_gezhonglei2007的博客-CSDN博客
一些题目整理#xff0c;附带大佬的解释
1.go中哪些值不能寻址
常量#xff08;const常量#xff0c;字面值3.14#xff0c;字符串“xxx”#xff0c;函数或方法, map的val值#xff09;
golang中接…Golang开发新手常犯的50个错误_gezhonglei2007的博客-CSDN博客
一些题目整理附带大佬的解释
1.go中哪些值不能寻址
常量const常量字面值3.14字符串“xxx”函数或方法, map的val值
golang中接口的值为什么是不可寻址的以及golang中哪些是不可取址的_golang 不可寻址-CSDN博客
2.range的一个返回值和两个返回值 3.有缓冲的和无缓冲channel
有缓冲的channel和无缓冲的channel_wx6360867ce0633的技术博客_51CTO博客
无缓冲的chan要求是从发送方拿到的东西立刻给接收方不得延误所以实时性高同步。
有缓冲的chan对会先放到缓冲里 缓冲填满后再发送稳定但是实时性低。 4.判断nil
接口有类型和实值两种只有类型和实际值都是nil接口变量才等于nil。
一般类型不会有值和类型不一致只需值为nil即可算成nil。 5.select语句特性
Go 语言 select 语句 | 菜鸟教程 (runoob.com)
select 是 Go 中的一个控制结构类似于 switch 语句。
select 语句只能用于通道操作每个 case 必须是一个通道操作要么是发送要么是接收。
select 语句会监听所有指定的通道上的操作一旦其中一个通道准备好就会执行相应的代码块。
如果多个通道都准备好那么 select 语句会随机选择一个通道执行。如果所有通道都没有准备好那么执行 default 块中的代码。 6包package定义
包(pkg)是 Go ⼯作区中包含 Go 源⽂件或其他包的⽬录。源⽂件中的每个函数、变量和类型都存储在链接包中。每个 Go 源⽂件都属于⼀个包 7.字符串拼接 8.字符串转成byte数组会发⽣内存拷⻉吗
golang面试题字符串转成byte数组会发生内存拷贝吗 (qq.com)
一般强转都会拷贝除非调用unsafe包的方法 9.拷⻉⼤切⽚⼀定⽐⼩切⽚代价⼤吗
一样因为slice的结构都是两个int一个uintptr指针 10.json包变量不加tag会怎么样
有tag用tag没有就按原来的。小写私有字段会忽略序列化。 11.reflect反射包如何获取字段tag为什么json包不能导出私有变量的tag
可以用reflect获取其type然后调用get(json)获取其json标签见链接
golang面试题reflect反射包如何获取字段tag为什么json包不能导出私有变量的tag (qq.com) 12.for range的循环次数
昨天那个在for循环里append元素的同事今天还在么 (qq.com)
次数取决于开始循环时候的len之后不会重新计算所以不会因为遍历目标长度改变而死循环。
for i ,len(s),i 这种每次都重新计算len所以可能死循环。
因此for range适合与读取正在push和pop的管道。 13.struct比较
相同类型的可以比较不同类型不可比。
相同类型中字段如有不能比较的结构体也不能比较。
只有同类型且字段都可以比较的结构体才可以
Go | struct 的比较_如何比较两个struct相不相等_CnPeng的博客-CSDN博客 14.显示类型转换 15.协程Goroutine和线程区别 从调度上看goroutine的调度开销远远⼩于线程调度开销。 OS的线程由OS内核调度每隔⼏毫秒⼀个硬件时钟中断发到CPUCPU调⽤⼀个调度器内核函数。这个函数暂停当前正在运⾏的线程把他的寄存器信息保存到内存中查看线程列表并决定接下来运⾏哪⼀个线程再从内存中恢复线程的注册表信息最后继续执⾏选中的线程。这种线程切换需要⼀个完整的上下⽂切换即保存⼀个线程的状态到内存再恢复另外⼀个线程的状态最后更新调度器的数据结构。某种意义上这种操作还是很慢的。 Go运⾏的时候包涵⼀个⾃⼰的调度器这个调度器使⽤⼀个称为⼀个M:N调度技术m个goroutine到n个os线程可以⽤GOMAXPROCS来控制n的数量Go的调度器不是由硬件时钟来定期触发的⽽是由特定的go语⾔结构来触发的他不需要切换到内核语境所以调度⼀个goroutine⽐调度⼀个线程的成本低很多。从栈空间上goroutine的栈空间更加动态灵活。每个OS的线程都有⼀个固定⼤⼩的栈内存通常是2MB栈内存⽤于保存在其他函数调⽤期间哪些正在执⾏或者临时暂停的函数的局部变量。这个固定的栈⼤⼩如果对于goroutine来说可能是⼀种巨⼤的浪费。作为对⽐goroutine在⽣命周期开始只有⼀个很⼩的栈典型情况是2KB, 在go程序中⼀次创建⼗万左右的goroutine也不罕⻅2KB*100,000200MB。⽽且goroutine的栈不是固定⼤⼩它可以按需增⼤和缩⼩最⼤限制可以到1GB。 goroutine没有⼀个特定的标识。 在⼤部分⽀持多线程的操作系统和编程语⾔中线程有⼀个独特的标识通常是⼀个整数或者指针这个特性可以让我们构建⼀个线程的局部存储本质是⼀个全局的map以线程的标识作为键这样每个线程可以独⽴使⽤这个map存储和获取值不受其他线程⼲扰。 goroutine中没有可供程序员访问的标识原因是⼀种纯函数的理念不希望滥⽤线程局部存储导致⼀个不健康的超距作⽤即函数的⾏为不仅取决于它的参数还取决于运⾏它的线程标识。 16.切片比较
第二行不知为何对待解惑
我猜是先进行类型比较然后再进行内容比较类型不一样直接false了
go的比较_go 比较_~kiss~的博客-CSDN博客
Go 学习笔记89 — 接口类型变量的等值比较操作nil 接口变量、空接口类型变量、非空接口类型变量_golang 动态类型 是否为nil_wohu007的博客-CSDN博客 17.协程是什么如何停止
协程由程序控制是一种特殊函数可以挂起或者继续运行。一个线程的多个协程是串行的同时只能执行一个协程。 golang 终止 goroutine - Mr.peter - 博客园 (cnblogs.com)
1.手动调用 runtime.Goexit() 来手动终止协程
2.用for-range退出一直读取chan只有当chan关闭且读完之后才会退出chan不关闭会阻塞 3.for-select可以同时处理多个chan
4.设置一个状态通道stop专门给所有协程发送关闭信息 18.除了加Mutex锁以外还有哪些⽅式安全读写共享变量
Golang中Goroutine 可以通过 Channel 进⾏安全读写共享变量。
19.chan同步 20.switch 21. ADD
AC正确
func Test54(t *testing.T) {var a Integer 1var b Integer 2var i interface{} asum : i.(*Integer).Add(b)fmt.Println(sum)
}
A.
type Integer int
func (a Integer) Add(b Integer) Integer {return a b
}
B.
type Integer int
func (a Integer) Add(b *Integer) Integer {return a *b
}
C.
type Integer int
func (a *Integer) Add(b Integer) Integer {return *a b
}
D.
type Integer int
func (a *Integer) Add(b *Integer) Integer {return *a *b
}
Go面试面试题笔记整理一_对于局部变量整型切片x的赋值,下面定义正确的是()_pengpengzhou的博客-CSDN博客
关键在于bb作为方法参数是必须类型对应的不能传指针 对于方法的参数而言指针类型的参数不能接受值类型的参数反之亦然所以BD是错的。而对于结构体的方法而言不论定义成值方法或者指针方法都可以同时支持用指针或者非指针实例来调用。 22.Go的bool
go不支持int和bool的强转和cpp不一样 23.go语⾔的并发机制以及MPG模型 Goroutine 是Golang实际并发执⾏的实体它底层是使⽤协程(coroutine)实现并发coroutine是⼀种运⾏在⽤户 态的⽤户线程类似于 greenthreadgo底层选择使⽤coroutine的出发点是因为它具有以下特点 ⽤户空间 避免了内核态和⽤户态的切换导致的成本。 可以由语⾔和框架层进⾏调度。 更⼩的栈空间允许创建⼤量的实例 MPG Golang内部有三个对象 P对象(processor) 代表上下⽂或者可以认为是cpu核心M(work thread)代表⼯作线程G对象goroutine. 正常情况下⼀个cpu对象启⼀个⼯作线程对象线程去检查并执⾏goroutine对象。碰到goroutine对象阻塞的时候会启动⼀个新的⼯作线程以充分利⽤cpu资源。 所有有时候线程对象会⽐处理器对象多很多. 在单核情况下所有Goroutine运⾏在同⼀个线程M0中每⼀个线程维护⼀个上下⽂P任何时刻⼀个 上下⽂中只有⼀个Goroutine其他Goroutine在runqueue中等待。 ⼀个Goroutine运⾏完⾃⼰的时间⽚后让出上下⽂⾃⼰回到runqueue中如下图所示。 当正在运⾏的G0阻塞的时候可以需要IO会再创建⼀个线程M1P转到新的线程中去运⾏。 24.并发控制模型
1.channel通知实现并发控制
无缓冲通道能实现并发控制控制读写同步否则阻塞。 当主 goroutine 运⾏到 -ch 接受 channel 的值的时候如果该 channel 中没有数据就会⼀直阻塞等待直到有值。 这样就可以简单实现并发控制。
2.通过sync包中的WaitGroup实现并发控制
深入理解 go sync.Waitgroup - 掘金 (juejin.cn)
Goroutine是异步执⾏的有的时候为了防⽌在结束mian函数的时候结束掉Goroutine所以需要同步等待这个时候就需要⽤ WaitGroup了在 sync 包中提供了 WaitGroup 它会等待它收集的所有 goroutine 任务全部完成。在WaitGroup⾥主要有三个⽅法:
1Add, 可以添加或减少 goroutine的数量. 2Done, 相当于Add(-1). 3Wait, 执⾏后会堵塞主线程直到WaitGroup ⾥的值减⾄0.主线程等所有协程结束才继续运行 3.上下文Context
Context是包括⼀个程序的运⾏环境、现场和快照等。每个程序要运⾏时都需要知道当前程序的运⾏状态通常Go 将这些封装在⼀个 Context ⾥再将它传给要执⾏的 goroutine 。
context 包主要是⽤来处理多个 goroutine 之间共享数据及多个 goroutine 的管理。 25.协程线程进程的区别 26.