## 寫出以下代碼出現的問題
~~~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包的內存泄漏