返回顶部
首页 > 资讯 > 后端开发 > GO >Go语言面试题之select和channel的用法
  • 422
分享到

Go语言面试题之select和channel的用法

2024-04-02 19:04:59 422人浏览 安东尼
摘要

目录select先说switch...case...再说select...case..select类比switch经典示例运行结果channel1.从已经关闭并且没有值的通道中取值2

select

先说switch...case...

switch...case... 很常用,且很好理解。其作用和if...else...一样。

区别是switch...case 相比于if...else...能让我们的代码看起来更清晰,更好理解。

再说select...case..

golang 的 select 就是监听 io 操作,当 IO 操作发生时,触发相应的动作。 

所说的IO操作就是对channle的操作:向通道发送数据,或者从通道中读取数据。

在执行select语句的时候,运行时系统会自上而下地判断每个case中的发送或接收操作是否可以被立即执行

什么是立即执行呢?

立即执行:意思是当前Goroutine不会因当前操作而被阻塞

select类比switch

select的用法与switch非常类似,由select开始一个新的选择块,每个选择条件由case语句来描述。

与switch语句可以选择任何可使用相等比较的条件相比,select有比较多的限制,其中最大的一条限制就是每个case语句里必须是一个IO操作。

确切的说,应该是一个面向channel的IO操作。

经典示例

package main

import "fmt"

func main() {
   ch1 := make(chan int, 1)
   ch1 <- 2
   select {
   case v := <-ch1:
      fmt.Println("取到的数据:", v)
   case ch1 <- 1:
      fmt.Println("写入数据")
   }
}

运行结果

channel

goroutine和channel作为go语言中最重要的两个知识点,一定要搞清楚。

大家容易出错的知识点是以下3点,尤其是最后一点:

1.nil channel代表channel未初始化,向未初始化的channel读写数据会造成阻塞

2.关闭(close)未初始化的channel会引起panic。

3.从一个关闭的并且没有值的通道执行接收操作会得到对应类型的零值,并不会引起panic。

1.从已经关闭并且没有值的通道中取值

package main

import "fmt"

//从关闭的通道中取值示例:
func main() {
   //声明实例化通道ch1
   ch1 := make(chan int, 1)
   //关闭通道
   close(ch1)
   select {
   //通通道ch1中取值
   case v := <-ch1:
      fmt.Printf("从ch1中取值:%d\n", v)
   default:
      fmt.Println("默认case")
   }
}

运行结果

和我们预想中的一样,取到了对应的零值:

2.从已经关闭并且有值的通道中取值

我们稍微修改一下上面的代码

package main

import "fmt"

//从关闭的通道中取值示例:
func main() {
   //声明实例化通道ch1
   ch1 := make(chan int, 1)
   //向通道中赋值
   ch1 <- 1
   //关闭通道
   close(ch1)
   //关闭之后取值
   after_close_value := <-ch1
   fmt.Printf("关闭之后取值:%d\n", after_close_value) //打印结果:关闭之后取值:1
   select {
   //通通道ch1中取值
   case v := <-ch1:
      fmt.Printf("从ch1中取值:%d\n", v) //打印结果:从ch1中取值:0
   default:
      fmt.Println("默认case")
   }
}

运行结果

运行结果和我们预想中的一样:

  • 通道关闭后,如果通道中仍然有值,还是可以正常取到通道中的值的。
  • 通道关闭后,如果通道中已经没有值了,再从通道中取值,并不会引起panic,而是会取到对应类型的零值。

一图胜千言

下面的表格中总结了对不同状态下的通道执行相应操作的结果。

注意: 对已经关闭的通道再执行 close 也会引发 panic。

总结

本文解析了Go语言中select和channel面试中可能遇到的进阶知识点。

到此这篇关于Go语言面试题之select和channel的用法的文章就介绍到这了,更多相关Go select channel内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: Go语言面试题之select和channel的用法

本文链接: https://lsjlt.com/news/121152.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Go语言面试题之select和channel的用法
    目录select先说switch...case...再说select...case..select类比switch经典示例运行结果channel1.从已经关闭并且没有值的通道中取值2...
    99+
    2024-04-02
  • 初探Go语言中的Goroutine和channel
    本篇文章带大家初步了解Go语言中的Goroutine和channel,希望对大家有所帮助!Go 语言的 CSP 并发模型的实现包含两个主要组成部分:一个是 Goroutine,另一个是 channel。本文将会介绍它们的基本用法和注意事项。...
    99+
    2023-05-14
    go语言 Golang
  • Go语言中的Goroutine和channel怎么使用
    这篇“Go语言中的Goroutine和channel怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Go语言中的Gor...
    99+
    2023-07-05
  • GO语言学习笔记:Load面试题的技巧和方法
    随着互联网的不断发展,计算机科学领域的各种编程语言也不断涌现。作为一种新兴的编程语言,GO语言备受关注,越来越多的程序员开始学习和使用它。在学习GO语言的过程中,面试题是一个非常重要的环节。Load面试题是一类常见的面试题,本文将为大家介...
    99+
    2023-09-06
    学习笔记 load 面试
  • Go语言select语句用法示例
    目录用法使用场景实现收发功能注意事项用法 多个通道 Channel 中信息的发送和接受处理的专用的语句—select 语句。select 语句会阻塞,直到其中的一个发送/...
    99+
    2024-04-02
  • Go语言的Channel遍历方法详解
    先来看看基本的定义: channel是Go语言中的一个核心类型,可以把它看成管道。并发核心单元通过它就可以发送或者接收数据进行通讯,这在一定程度上又进一步降低了编程的难度。 c...
    99+
    2022-06-07
    Channel GO 方法 go语言
  • Go语言在面试中的常见问题
    Go语言在近年来的发展中,成为了一个备受关注的编程语言。其简洁、高效、安全的特点,使得越来越多的公司和开发者开始关注和使用它。作为一个Go语言的开发者,我们需要掌握它的基本语法和常用库函数,同时也需要了解一些常见的面试问题,以便在面试中更...
    99+
    2023-06-13
    load 面试 shell
  • Go语言切片常考的面试真题解析
    目录前言01. 数组和切片有什么区别02. 拷贝大切片一定比拷贝小切片代价大吗03. 切片的深浅拷贝04. 零切片、空切片、nil切片是什么05. 切片的扩容策略07. 参数传递切片...
    99+
    2024-04-02
  • 缓存是如何影响面试中的Go语言和JavaScript问题的?
    在计算机科学中,缓存是一种用于提高程序性能的技术,它通过将常用数据存储在更快的存储器中,以加快数据访问速度。尽管缓存技术已经存在了很长时间,但仍然是面试中经常被提及的话题。在本文中,我们将探讨缓存如何影响面试中的Go语言和JavaScri...
    99+
    2023-06-29
    缓存 javascript 面试
  • 面试常见问题之C语言与C++的区别问题
    目录C和C++的区别关键字static在C和C++区别1.定义局部静态变量2.限定访问区域答案结构体在C语言和C++的区别C中malloc和C++的new区别C++引用和C的指针有何...
    99+
    2024-04-02
  • 面试GO语言:如何应对函数相关问题?
    在GO语言中,函数是一个非常重要的概念,因此在面试中,经常会涉及到关于函数的问题。本文将着重介绍如何应对面试中关于函数的问题。 一、函数的定义和调用 在GO语言中,函数的定义使用关键字func,例如: func add(a int, b ...
    99+
    2023-08-30
    面试 函数 leetcode
  • Go语言面试题:如何处理存储关键字?
    在Go语言中,关键字是指被Go语言保留用于特定用途的标识符,如if、else、for等等。在编写代码时,我们需要注意到关键字的使用,以避免出现语法错误和运行时错误。而在存储关键字时,我们需要考虑如何处理这些特殊的标识符。本篇文章将介绍如何...
    99+
    2023-08-19
    关键字 面试 存储
  • Go 语言面试问题:您是否了解并发编程和协程?
    随着计算机技术的不断发展,现代软件系统已经变得越来越庞大而复杂。在这些系统中,同时处理多个任务已经成为一项基本的需求。因此,并发编程已经成为当今软件开发领域中的一个重要话题。作为一门新兴的编程语言,Go 语言旨在提供一种简单而强大的并发编...
    99+
    2023-07-02
    shell bash 面试
  • Go语言并发和JavaScript面试有哪些联系?
    Go语言是一种开发高性能服务器应用程序的编程语言,其最大的特点是并发性能非常出色。而JavaScript则是一个广泛应用于前端开发的编程语言,其主要特点是单线程执行,但通过异步编程技巧可以实现非阻塞IO操作。虽然这两种语言看似差异很大,但...
    99+
    2023-06-23
    并发 javascript 面试
  • 面试必备:跟着GO语言学习笔记学习如何Load面试题!
    面试是每个程序员都不可避免的一项任务,而在面试前,我们需要先准备好一些必备的知识和技能,才能在面试中展现出我们的实力。在这篇文章中,我们将介绍如何通过GO语言学习笔记来学习如何Load面试题,帮助大家在面试中更加游刃有余。 一、GO语言学习...
    99+
    2023-09-06
    学习笔记 load 面试
  • GO语言分布式面试中常见的问题有哪些?
    随着互联网的发展,分布式系统已经成为了现代软件开发中必不可少的一部分。而在分布式系统的开发中,GO语言作为一种高效、可靠、简洁的编程语言,也越来越受到开发者的青睐。在GO语言分布式面试中,常见的问题有哪些呢?下面我们来详细了解一下。 什...
    99+
    2023-06-29
    分布式 面试 教程
  • 怎样通过面试?GO语言学习笔记告诉你Load面试题的诀窍!
    面试是每个求职者都需要经历的一道关卡,而面试中的Load面试题更是考察了面试者的知识储备、分析能力和解决问题的能力。那么如何通过Load面试题呢?本文将结合GO语言学习笔记,为大家介绍几个面试技巧和实际演示。 一、了解Load面试题的基本...
    99+
    2023-09-06
    学习笔记 load 面试
  • 面试必备:GO语言函数相关LeetCode题目详解!
    GO语言函数相关LeetCode题目详解 在面试中,函数是GO语言中最基本的组件之一。它是编写模块化代码和在代码中复用逻辑的主要方式。因此,当您准备面试时,了解如何编写和分析函数是非常重要的。在本文中,我们将探讨一些与函数相关的LeetCo...
    99+
    2023-08-30
    面试 函数 leetcode
  • GO语言学习笔记:如何优雅地Load面试题?
    在准备面试的过程中,我们经常需要大量的面试题来进行复习。而如何优雅地加载这些面试题,成为了我们需要解决的问题。在这篇文章中,我们将介绍如何使用GO语言来优雅地加载面试题。 GO语言是一种静态类型、编译型的编程语言。它拥有高效的垃圾回收机制...
    99+
    2023-09-06
    学习笔记 load 面试
  • C语言sizeof和strlen的指针和数组面试题详解
    目录一、概念         sizeof:strlen:二、例题及解析2.1 一维数组2.2 字符数...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作