老男孩教育专注IT教育10余年,只培养IT技术精英

全国免费咨询电话(渠道合作):400-609-2893

Go语言面试题(八)!老男孩GO语言学习内容

老男孩IT教育

行业新闻

2021年7月19日 17:22

GO语言面试题汇总,正在准备面试的小伙伴们,这篇文章你一定要看,希望能够帮你们找到满意的工作。

  GO语言面试题汇总,正在准备面试的小伙伴们,这篇文章你一定要看,希望能够帮你们找到满意的工作。

  一、在utf8字符串判断是否包含指定字符串,并返回下标。

  例:"北京天安门最美丽" , "天安门" 结果:2

package main

import (
    "fmt"
    "strings"
)

func main() {
    fmt.Println(Utf8Index("北京天安门最美丽", "天安门"))
    fmt.Println(strings.Index("北京天安门最美丽", "男"))
    fmt.Println(strings.Index("", "男"))
    fmt.Println(Utf8Index("12ws北京天安门最美丽", "天安门"))
}

func Utf8Index(str, substr string) int {
    asciiPos := strings.Index(str, substr)
    if asciiPos == -1 || asciiPos == 0 {
        return asciiPos
    }
    pos := 0
    totalSize := 0
    reader := strings.NewReader(str)
    for _, size, err := reader.ReadRune(); err == nil; _, size, err = reader.ReadRune() {
        totalSize += size
        pos++
        // 匹配到
        if totalSize == asciiPos {
            return pos
        }
    }
    return pos
}

  二、执行下面的代码发生什么?

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int, 1000)
    go func() {
        for i := 0; i < 10; i++ {
            ch <- i
        }
    }()
    go func() {
        for {
            a, ok := <-ch
            if !ok {
                fmt.Println("close")
                return
            }
            fmt.Println("a: ", a)
        }
    }()
    close(ch)
    fmt.Println("ok")
    time.Sleep(time.Second * 100)
}

  往已经关闭的channel写入数据会panic的。输出结果:

panic: send on closed channel

  三、反转整数 反转一个整数,例如:

  例子1: x = 123, return 321

  例子2: x = -123, return -321

  输入的整数要求是一个 32bit 有符号数,如果反转后溢出,则输出 0

package main

import (
    "fmt"
    "math"
)

func main() {
    fmt.Println(reverse(123456789))
}
func reverse(x int) (num int) {
    for x != 0 {
        num = num*10 + x%10
        x = x / 10
    }
    // 使用 math 包中定义好的最大最小值
    if num > math.MaxInt32 || num < math.MinInt32 {
        return 0
    }
    return
}

  四、下面代码输出什么?

package main

import "fmt"

func main() {
    fmt.Println(len("你好bj!"))
}

  运行输出:

  9

  五、编译并运行如下代码会发生什么?

package main

import "fmt"

type Test struct {
    Name string
}

var list map[string]Test

func main() {
    list = make(map[string]Test)
    name := Test{"xiaoming"}
    list["name"] = name
    list["name"].Name = "Hello"
    fmt.Println(list["name"])
}

  编译错误:

cannot assign to struct field list["name"].Name in map

  因为list["name"]不是一个普通的指针值,map的value本身是不可寻址的,因为map中的值会在内存中移动,并且旧的指针地址在map改变时会变得无效。定义的是var list map[string]Test,注意哦Test不是指针,而且map我们都知道是可以自动扩容的,那么原来的存储name的Test可能在地址A,但是如果map扩容了地址A就不是原来的Test了,所以go就不允许我们写数据。你改为var list map[string]*Test试试看。

  随着Go语言自身的逐渐优化及Go语言社区的不断发展壮大,笔者相信Go语言一定会拥有广阔的未来。

  老男孩教育2021年Go开发课程全面升级(周末班),试听即送价值69元纸质教材一本,如果您想要学习GO语言课程,欢迎前来试听。

  推荐阅读:

  GO语言面试题(七)!老男孩GO培训价格

  GO语言面试题(六)!老男孩GO语言学习周期

  GO语言面试题(五)!老男孩GO语言怎么样?

本文经授权发布,不代表老男孩教育立场。如若转载请联系原作者。