教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 Golang面试题解析(五)

Golang面试题解析(五)

发布时间:2022-02-09   编辑:jiaochengji.com
教程集为您提供Golang面试题解析(五)等资源,欢迎您收藏本站,我们将为您提供最新的Golang面试题解析(五)资源

2019独角兽企业重金招聘Python工程师标准>>>

<h2>41.执行下面的代码发生什么?</h2> <pre><code class="language-go">package main type Param map[string]interface{} type Show struct { *Param } func main() { s := new(Show) s.Param["RMB"] = 10000 } </code></pre> <h3>考点:map初始化</h3>

map需要初始化后才能使用。
编译错误:invalid operation: s.Param["RMB"] (type *Param does not support indexing)

<h2>42.执行下面的代码发生什么?</h2> <pre><code class="language-go">package main import "fmt" type student struct { Name string } func zhoujielun(v interface{}) { switch msg := v.(type) { case *student, student: msg.Name = "qq" fmt.Print(msg) } } </code></pre> <h3>考点:类型转换</h3>

msg不属于student类型,所以没有Name字段。
改为:

<pre><code>s := v.(student) s.Name = "qq" </code></pre> <h2>43.执行下面的代码发生什么?</h2> <pre><code class="language-go">package main import ( "encoding/json" "fmt" ) type People struct { name string `json:"name"` } func main() { js := `{ "name":"11" }` var p People err := json.Unmarshal([]byte(js), &p) if err != nil { fmt.Println("err: ", err) return } fmt.Println("people: ", p) } </code></pre> <h3>考点:结构体访问控制</h3>

这道题坑很大,很多同学一看就以为是<code>p</code>的初始化问题,实际上是因为<code>name</code>首字母是小写,导致其他包不能访问,所以输出为空结构体。
改为:

<pre><code>type People struct { Name string `json:"name"` } </code></pre> <h2>44.以下代码有什么问题?</h2> <pre><code class="language-go">package main func Stop(stop <-chan bool) { close(stop) } </code></pre> <h3>考点:close channel</h3>

有方向的channel不可被关闭

<h2>45.实现一个函数可以根据指定的size切割切片为多个小切片</h2> <h3>解析</h3> <pre><code class="language-go">func main() { lenth := 11 size := 5 list := make([]int, 0, lenth) for i := 0; i < lenth; i { list = append(list, i) } SpiltList(list, size) } func SpiltList(list []int, size int) { lens := len(list) mod := math.Ceil(float64(lens) / float64(size)) spliltList := make([][]int, 0) for i := 0; i < int(mod); i { tmpList := make([]int, 0, size) fmt.Println("i=", i) if i == int(mod)-1 { tmpList = list[i*size:] } else { tmpList = list[i*size : i*size size] } spliltList = append(spliltList, tmpList) } for i, sp := range spliltList { fmt.Println(i, " ==> ", sp) } } </code></pre> <h2>46.实现两个go轮流输出:A1B2C3.....Z26</h2> <h3>解析</h3> <h4>方法一:有缓冲chan</h4> <pre><code class="language-go">func ChannelFunc() { zimu := make(chan int, 1) suzi := make(chan int, 1) zimu <- 0 // zimu go func() { for i := 65; i <= 90; i { <-zimu fmt.Printf("%v", string(rune(i))) suzi <- i } return }() go func() { for i := 1; i <= 26; i { <-suzi fmt.Printf("%v", i) zimu <- i } return }() time.Sleep(1 * time.Second) fmt.Println() } </code></pre> <h4>方法二:无缓冲chan</h4> <pre><code class="language-go">func Channel1Func() { zimu := make(chan int) suzi := make(chan int) // zimu go func() { for i := 65; i <= 90; i { fmt.Printf("%v", string(rune(i))) zimu <- i <-suzi } return }() go func() { for i := 1; i <= 26; i { <-zimu fmt.Printf("%v", i) suzi <- i } return }() time.Sleep(10 * time.Second) fmt.Println() } </code></pre> <h3>方法三:使用锁</h3>

大家可以自己实现,把结果留言给我,答案后续公布。

<h2>47.执行下面代码输出什么?</h2> <pre><code class="language-go">package main // 47.执行下面代码输出什么? import "fmt" func main() { five := []string{"Annie", "Betty", "Charley", "Doug", "Edward"} for _, v := range five { five = five[:2] fmt.Printf("v[%s]\n", v) } } </code></pre> <h3>考点:range副本机制</h3>

循环内的切片值会缩减为2,但循环将在切片值的自身副本上进行操作。 这允许循环使用原始长度进行迭代而没有任何问题,因为后备数组仍然是完整的。
结果:

<pre><code>v[Annie] v[Betty] v[Charley] v[Doug] v[Edward] </code></pre> <h2>48.for 和 for range有什么区别?</h2> <h3>考点:for range</h3> <ol><li>使用场景不同 for可以 <ul><li>遍历array和slice</li><li>遍历key为整型递增的map</li><li>遍历string for range可以完成所有for可以做的事情,却能做到for不能做的,包括</li><li>遍历key为string类型的map并同时获取key和value</li><li>遍历channel</li></ul></li><li>实现不同 for可以获取到的是被循环对象的元素本身,可以对其进行修改; for range使用值拷贝的方式代替被遍历的元素本身,是一个值拷贝,而不是元素本身。</li></ol><h2>49.解决下面问题:输出MutilParam= [ssss [1 2 3 4]]如何做到输出为[ssss 1 2 3 4]?</h2> <pre><code class="language-go">package main import "fmt" func MutilParam(p ...interface{}) { fmt.Println("MutilParam=", p) } func main() { MutilParam("ssss", 1, 2, 3, 4) //[ssss 1 2 3 4] iis := []int{1, 2, 3, 4} MutilParam("ssss", iis) //输出MutilParam= [ssss [1 2 3 4]]如何做到输出为[ssss 1 2 3 4] } </code></pre> <h3>考点:函数变参</h3>

这样的情况会在开源类库如xorm升级版本后出现Exce函数不兼容的问题。 解决方式有两个:

<h4>方法一:interface[]</h4> <pre><code class="language-go">tmpParams := make([]interface{}, 0, len(iis) 1) tmpParams = append(tmpParams, "ssss") for _, ii := range iis { tmpParams = append(tmpParams, ii) } MutilParam(tmpParams...) </code></pre> <h4>方法二:反射</h4> <pre><code class="language-go">f := MutilParam value := reflect.ValueOf(f) pps := make([]reflect.Value, 0, len(iis) 1) pps = append(pps, reflect.ValueOf("ssss")) for _, ii := range iis { pps = append(pps, reflect.ValueOf(ii)) } value.Call(pps) </code></pre> <h2>50.编译并运行如下代码会发生什么?</h2> <pre><code class="language-go">package main // 50.编译并运行如下代码会发生什么? import "fmt" func main() { mmap := make(map[map[string]string]int, 0) mmap[map[string]string{"a": "a"}] = 1 mmap[map[string]string{"b": "b"}] = 1 mmap[map[string]string{"c": "c"}] = 1 fmt.Println(mmap) } </code></pre> <h3>考点:map key类型</h3>

golang中的map,的 key 可以是很多种类型,比如 bool, 数字,string, 指针, channel , 还有 只包含前面几个类型的 interface types, structs, arrays。
显然,slice, map 还有 function 是不可以了,因为这几个没法用 <code>==</code> 来判断,即不可比较类型。 可以将<code>map[map[string]string]int</code>改为<code>map[struct]int</code>。

<ins class="adsbygoogle"/>

转载于:https://my.oschina.net/qiangmzsx/blog/2052285

到此这篇关于“Golang面试题解析(五)”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
golang基础教程
想系统学习GO语言(Golang
连怎么避免内存逃逸都不知道?怎么进BAT?
golang byte转string_golang面试题:怎么避免内存逃逸?
golang面试题第六天
golang面试题第十一天
Golang面试题总结
golang 面试
Golang 面试题
golang面试题分析03_GMP调度器

[关闭]
~ ~