切换导航
{{systemName}}
{{ info.Title }}
{{info.Title}}
{{ menu.Title }}
{{menu.Title}}
登录
|
退出
搜索
七道语法找错题目
作者:ych
## 写出以下代码出现的问题 ```go package main import ( "fmt" ) func main() { var x string = nil if x == nil { x = "default" } fmt.Println(x) } ``` golang 中字符串是不能赋值 `nil` 的,也不能跟 `nil` 比较。 ## 写出以下打印内容 ```go package main import "fmt" const ( a = iota b = iota ) const ( name = "menglu" c = iota d = iota ) func main() { fmt.Println(a) fmt.Println(b) fmt.Println(c) fmt.Println(d) } ``` ## 找出下面代码的问题 ```go package main import "fmt" type query func(string) string func exec(name string, vs ...query) string { ch := make(chan string) fn := func(i int) { ch <- vs[i](name) } for i, _ := range vs { go fn(i) } return <-ch } func main() { ret := exec("111", func(n string) string { return n + "func1" }, func(n string) string { return n + "func2" }, func(n string) string { return n + "func3" }, func(n string) string { return n + "func4" }) fmt.Println(ret) } ``` 上面的代码有严重的内存泄漏问题,出错的位置是 `go fn(i)`,实际上代码执行后会启动 4 个协程,但是因为 `ch` 是非缓冲的,只可能有一个协程写入成功。而其他三个协程会一直在后台等待写入。 ## 写出以下打印结果,并解释下为什么这么打印的。 ```go package main import ( "fmt" ) func main() { str1 := []string{"a", "b", "c"} str2 := str1[1:] str2[1] = "new" fmt.Println(str1) str2 = append(str2, "z", "x", "y") fmt.Println(str1) } ``` golang 中的切片底层其实使用的是数组。当使用`str1[1:]` 使,`str2` 和 `str1` 底层共享一个数组,这回导致 `str2[1] = "new"` 语句影响 `str1`。 而 `append` 会导致底层数组扩容,生成新的数组,因此追加数据后的 `str2` 不会影响 `str1`。 但是为什么对 `str2` 复制后影响的确实 `str1` 的第三个元素呢?这是因为切片 `str2` 是从数组的第二个元素开始,`str2` 索引为 1 的元素对应的是 `str1` 索引为 2 的元素。 ## 写出以下打印结果 ```go package main import ( "fmt" ) type Student struct { Name string } func main() { fmt.Println(&Student{Name: "menglu"} == &Student{Name: "menglu"}) fmt.Println(Student{Name: "menglu"} == Student{Name: "menglu"}) } ``` 个人理解:指针类型比较的是指针地址,非指针类型比较的是每个属性的值。 ## 写出以下代码的问题 ```go package main import ( "fmt" ) func main() { fmt.Println([...]string{"1"} == [...]string{"1"}) fmt.Println([]string{"1"} == []string{"1"}) } ``` 数组只能与相同纬度长度以及类型的其他数组比较,切片之间不能直接比较。。 ## 下面代码写法有什么问题? ```go package main import ( "fmt" ) type Student struct { Age int } func main() { kv := map[string]Student{"menglu": {Age: 21}} kv["menglu"].Age = 22 s := []Student{{Age: 21}} s[0].Age = 22 fmt.Println(kv, s) } ``` golang中的`map` 通过`key`获取到的实际上是两个值,第一个是获取到的值,第二个是是否存在该`key`。因此不能直接通过`key`来赋值对象。
相关推荐
golang 中解析 tag 是怎么实现的?反射原理是什么?(中高级肯定会问,比较难,需要自己多去总结)
使用gorm不当出现too Many Connections的问题
golang map 使用注意的点,是否并发安全?
uint 类型溢出问题
Golang中defer和return执行的先后顺序
golang orm框架 gorm
讲讲 Go 的 select 底层数据结构和一些特性?(难点,没有项目经常可能说不清,面试一般会问你项目中怎么使用select)
golang中两个变量值的4种交换方式
golang进行封包和拆包的完整解决方案
对已经关闭的 chan 进行读写,会怎么样?为什么?
调用函数传入结构体时,应该传值还是指针? (Golang 都是传值)
为 sync.WaitGroup 中Wait函数支持 WaitTimeout 功能.
单例模式的应用场景
Golang判断slice是否相等
Golang空结构体 struct{} 的使用
讲讲 Go 的 defer 底层数据结构和一些特性?
go defer,多个 defer 的顺序,defer 在什么时机会修改返回值?
序列化协议
Golang 单引号,双引号,反引号的区别?
Golang表示枚举类型的详细讲解
昨天那个在for循环里append元素的同事,今天还在么?
什么是死锁?死锁产生的原因?如何避免死锁?
golang并发题目测试
交替打印数字和字母
golang面试题
for range 的时候它的地址会发生变化么?
B+树为什么快
数组和切片的区别 (基本必问)
实现阻塞读且并发安全的map
机器人坐标问题
复利计算 递归/非递归
在 golang 协程和channel配合使用
MySQL索引原理
写出以下逻辑,要求每秒钟调用一次proc并保证程序不退出?
讲讲 Go 的 slice 底层数据结构和一些特性?
高并发下的锁与map的读写
Redis的优点
判断两个给定的字符串排序后是否一致
常见语法题目2
字符串替换问题
ElasticSearch使用场景
常见语法题目1
golang 中 make 和 new 的区别?(基本必问)
判断字符串中字符是否全都不同
golang 实现一个负载均衡案例(随机,轮训)
redis缓存穿透、缓存击穿、缓存雪崩原因+解决方案
基本数据结构和算法
消息队列使用的场景介绍
操作系统基本原理
翻转字符串
redis在项目中的使用
TiDB使用场景
评论区
先去登录
版权所有:机遇屋在线 Copyright © 2021-2025 jiyuwu Co., Ltd.
鲁ICP备16042261号-1