Golang 面试题

这篇具有很好参考价值的文章主要介绍了Golang 面试题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

golang 面试题 - 诺唯的文章 - 知乎
https://zhuanlan.zhihu.com/p/26972862

  1. Panic and defer
package main

import (
   "fmt"
)

func main() {
   defer_call()
}

func defer_call() {
   defer func() { fmt.Println("打印前") }()
   defer func() { fmt.Println("打印中") }()
   defer func() { fmt.Println("打印后") }()

   panic("触发异常")
}

panic 触发会停止函数运行,然后按照栈的顺序执行 defer,最后退出函数,终止整个程序
2. map

 package main

import "fmt"

type student struct {
	Name string
	Age  int
}

func pase_student() {
	m := make(map[string]*student)
	stus := []student{
		{Name: "zhou", Age: 24},
		{Name: "li", Age: 23},
		{Name: "wang", Age: 22},
	}
	for _, stu := range stus {
		m[stu.Name] = &stu
	}
	fmt.Println(m)
}

func main() {
	pase_student()
	fmt.Println("Hello, 世界")
}

map[li:0xc000010030 wang:0xc000010030 zhou:0xc000010030]
Hello, 世界

stu 仅仅是一个用来拷贝的 struct, 取地址不变,可改为索引取值
3. goroutine

package main

import (
	"fmt"
	"runtime"
	"sync"
)

func main() {
	runtime.GOMAXPROCS(1)
	wg := sync.WaitGroup{}
	wg.Add(20)
	for i := 0; i < 10; i++ {
		go func() {
			fmt.Println("i: ", i)
			wg.Done()
		}()
	}
	for i := 0; i < 10; i++ {
		go func(i int) {
			fmt.Println("i: ", i)
			wg.Done()
		}(i)
	}
	wg.Wait()
}

i: 9
i: 10
i: 10
i: 10
i: 10
i: 10
i: 10
i: 10
i: 10
i: 10
i: 10
i: 0
i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8

不传参的话用的永远都是一个 i
4.

package main

import (
	"fmt"
)

type People struct{}

func (p *People) ShowA() {
	fmt.Println("showA")
	p.ShowB()
}
func (p *People) ShowB() {
	fmt.Println("showB")
}

type Teacher struct {
	People
}

func (t *Teacher) ShowB() {
	fmt.Println("teacher showB")
}

func main() {
	t := Teacher{}
	t.ShowA()
}

showA
showB

  1. select 语句
package main

import (
	"fmt"
	"runtime"
)

func main() {
	runtime.GOMAXPROCS(1)
	int_chan := make(chan int, 1)
	string_chan := make(chan string, 1)
	int_chan <- 1
	string_chan <- "hello"
	select {
	case value := <-int_chan:
		fmt.Println(value)
	case value := <-string_chan:
		panic(value)
	}
}

随机情况,多个 case 满足程序会伪随机执行一个
6. defer order

import (
	"fmt"
)

func calc(index string, a, b int) int {
	ret := a + b
	fmt.Println(index, a, b, ret)
	return ret
}

func main() {
	a := 1
	b := 2
	defer calc("1", a, calc("10", a, b))
	a = 0
	defer calc("2", a, calc("20", a, b))
	b = 1
}

10 1 2 3
20 0 2 2
2 0 2 2
1 1 3 4

先执行函数参数,defer 按照栈序执行
7.

func main() {
	s := make([]int, 5)
	s = append(s, 1, 2, 3)
	fmt.Println(s)
}

[0 0 0 0 0 1 2 3]
make 已经初始化结果

8.map

package main

import (
	"fmt"
	"sync"
)

type UserAges struct {
	ages map[string]int
	sync.Mutex
}

func (ua *UserAges) Add(name string, age int) {
	ua.Lock()
	defer ua.Unlock()
	ua.ages[name] = age
}

func (ua *UserAges) Get(name string) int {
	if age, ok := ua.ages[name]; ok {
		return age
	}
	return -1
}
func main() {
	s := make([]int, 5)
	s = append(s, 1, 2, 3)
	fmt.Println(s)
}

可能对 map 同时读写造成 panic
9.channel

func (set *threadSafeSet) Iter() <-chan interface{} {
	ch := make(chan interface{})
	go func() {
		set.RLock()

		for elem := range set.s {
			ch <- elem
		}

		close(ch)
		set.RUnlock()

	}()
	return ch
}

无缓冲的 channel 会发送阻塞,知道接收出数据
10.

package main

import (
	"fmt"
)

type People interface {
	Speak(string) string
}

type Stduent struct{}

func (stu *Stduent) Speak(think string) (talk string) {
	if think == "bitch" {
		talk = "You are a good boy"
	} else {
		talk = "hi"
	}
	return
}

func main() {
	var peo People = Stduent{}
	think := "bitch"
	fmt.Println(peo.Speak(think))
}

出错,指针和值的成员方法调用不一致
11.nil check

package main

import (
	"fmt"
)

type People interface {
	Show()
}

type Student struct{}

func (stu *Student) Show() {

}

func live() People {
	var stu *Student
	fmt.Println(stu)
	return stu
}

func main() {

	if live() == nil {
		fmt.Println("AAAAAAA")
	} else {
		fmt.Println("BBBBBBB")
	}
	a := live()
	if v, ok := a.(*Student); ok {
		fmt.Println(v == nil)

	}
}


<nil>
BBBBBBB
<nil>
true

interface 即有类型又有值文章来源地址https://www.toymoban.com/news/detail-517795.html

到了这里,关于Golang 面试题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [面试题~]Golang

    3.1 数组和切片的区别 Go语言中数组是固定长度的,不能动态扩容,在编译期就会确定大小。 切片是一种数据结构,包含一个底层数组的指针,当前切片个数 len 以及切片的最大容量 cap, 描述的是一块数组。 3.2 切片的扩容策略 切片的扩容都是调用growslice方法,不同版本,扩

    2024年01月18日
    浏览(24)
  • Golang 面试题

    golang 面试题 - 诺唯的文章 - 知乎 https://zhuanlan.zhihu.com/p/26972862 Panic and defer panic 触发会停止函数运行,然后按照栈的顺序执行 defer,最后退出函数,终止整个程序 2. map map[li:0xc000010030 wang:0xc000010030 zhou:0xc000010030] Hello, 世界 stu 仅仅是一个用来拷贝的 struct, 取地址不变,可改为索

    2024年02月12日
    浏览(31)
  • [面试题~] Golang

    1.1 逃逸分析是什么? 在编译原理中,分析指针动态范围的方法称之为逃逸分析。在Go中的表现是,如果一个对象的指针被多个方法或线程引用时,则称这个指针发生了逃逸。 所以,我认为逃逸分析指的是,通过分析变量的指针作用范围,来决定这个变量是分配在堆上还是栈

    2024年01月18日
    浏览(23)
  • Golang企业面试题

     Golang企业面试题 基础 高级 Golang有哪些优势? Golang数据类型有哪些 Golang中的包如何使用 Go 支持什么形式的类型转换? 什么是 Goroutine?你如何停止它? 如何在运行时检查变量类型? Go 两个接口之间可以存在什么关系? Go 当中同步锁有什么特点?作用是什么 Go 语言当中

    2024年01月24日
    浏览(27)
  • golang面试题大全

    1、与其他语言相比,使用 Go 有什么好处? 与其他作为学术实验开始的语言不同, Go 代码的设计是务实的。每个功能和语法决策都旨在让程序员的生活更轻松。 Golang 针对并发进行了优化,并且在规模上运行良好。 由于单一的标准代码格式, Golang 通常被认为比其他语言更具

    2024年01月20日
    浏览(23)
  • golang—面试题大全

    =是赋值,:=是声明并初始化一个新的变量 在 Go 语言中,并没有像一些其他编程语言那样使用传统的异常处理机制,Go 语言使用了一种不同的错误处理模式,通过返回错误值来进行错误处理。Go 的错误处理模式更加简洁和明确,使用了多返回值来传递错误信息。在 Go 中,通常

    2024年02月13日
    浏览(30)
  • Golang中级面试题

    Goroutine 和线程的区别 Goroutine 是 Go 中并发执行函数或方法的方式。它比线程更轻量级,因为它的创建和销毁的代价更低。与线程相比,Goroutine 在运行时的栈空间要小得多,并且可以根据需要动态增长和缩小。同时,Go 运行时也负责在系统线程上调度所有 Goroutine 的执行,这使

    2024年02月15日
    浏览(37)
  • Golang八股文面试题

    TCP实现可靠传输依靠的有序列号,自动重传,滑动窗口,确认应答等机制

    2024年04月15日
    浏览(49)
  • 20个 Golang 常见面试问题

    1 Goroutine 在  Golang中的作用是什么? Goroutines 使得 Golang 能够并发执行多线程任务,允许函数在不相互阻塞的情况下同时运行。 2 如何在 Golang 中处理共享资源的并发访问? Golang 提供了同步原语,如互斥锁(mutexes)和通道(channels),用于在并发场景中安全地访问和修改共享

    2024年04月28日
    浏览(32)
  • 高频golang面试题:简单聊聊内存逃逸?

    知道golang的内存逃逸吗?什么情况下会发生内存逃逸? golang程序变量会携带有一组校验数据,用来证明它的整个生命周期是否在运行时完全可知。如果变量通过了这些校验,它就可以在栈上分配。否则就说它 逃逸 了,必须在堆上分配。 能引起变量逃逸到堆上的典型情况:

    2024年02月09日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包