## 写出以下代码出现的问题
~~~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`来赋值对象。
- Golnag常见面试题目解析
- 交替打印数组和字母
- 判断字符串中字符是否全都不同
- 翻转字符串
- 判断两个给定的字符串排序后是否一致
- 字符串替换问题
- 机器人坐标计算
- 语法题目一
- 语法题目二
- goroutine和channel使用一
- 实现阻塞读的并发安全Map
- 定时与 panic 恢复
- 高并发下的锁与map读写问题
- 为 sync.WaitGroup 中Wait函数支持 WaitTimeout 功能.
- 七道语法找错题目
- golang 并发题目测试
- 记一道字节跳动的算法面试题
- 多协程查询切片问题
- 对已经关闭的的chan进行读写,会怎么样?为什么?
- 简单聊聊内存逃逸?
- 字符串转成byte数组,会发生内存拷贝吗?
- http包的内存泄漏