首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Go 基础面试题

如何在运行时检查变量类型? 在 Go 中,可以使用类型断言(Type Assertion) 或 类型开关(Type Switch) 在运行时检查一个变量的类型。...例如,make(chan int, 10)创建了一个传递整型数据的带有缓冲区大小为 10 的通道。 总结,make用于创建复杂的数据结构并返回一个有初始值的实例,而不是它们的零值指针。 15....切片则用在元素数量未知或需要经常改变大小的场景。 功能性: 切片支持更多功能,如append用于添加元素,以及内置的len和cap函数用来获取切片的长度和容量。...Go 语言在扩展切片容量时采用的是一个成长算法,具体来说,当你往切片append新元素,而现有容量不足以容纳更多元素时,Go 会创建一个新的切片,并将旧切片中的元素复制到这个新的,底层数组更大的切片中。...如果切片的长度小于 1024 个元素,通常会扩容到原来的 2 倍。 当旧切片的长度超过 1024 个元素时,扩容的策略会转变为每次增加约 25%的容量,而不是加倍,使得切片的增长曲线变得平缓些。

26310

面试官:说下Golang Slice的底层实现,泪崩了!

地址传递(引用传递)会将变量本身传入对应的函数,在函数中可以对该变 量进行值内容的修改。 3、Go 语言当中数组和切片在传递的时候的区别是什么?...切片本身并不是动态数组或者数组指针。它内部实现的数据结构通过指针引用 底层数组,设定相关属性将数据读写操作限定在指定的区域内。切片本身是一 个只读对象,其工作机制类似数组指针的一种封装。...Golang 的引用类型包括 slice、map 和 channel。它们有复杂的内部结构,除 了申请内存外,还需要初始化相关属性。内置函数 new 计算类型大小,为其分 配零值内存,返回指针。...而 make 会被编译器翻译成具体的创建函数,由其分 配内存和初始化成员结构,返回对象而非指针。...的位置(ring buffer 记录实现)、sendq、recvq 当前 channel 因为缓冲区不足 而阻塞的队列、使用双向链表存储、还有一个 mutex 锁控制并发、其他原属 等。

89020
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    go语言语法

    ,使用这些类型的变量都直接指向存在内存中的值 当使用等号 = 将一个变量的值赋值给另一个变量时,如:j = i,实际上是在内存中将 i 的值进行了拷贝: 值类型变量的值都存储在堆中 引用类型...切片就是没有指定长度的数组 ### 获取数组中的值 ```go b := a[:] //获取数组中的所有值,这也是基于数组的切片定义,此时b是一个切片而不是数组,b没有长度限制 获取切片的值是前包后不包的...,即 [1:4] 的取值实际上是1~3 获取切片的长度和容量 len()函数来获取切片的长度 cap()函数来获取切片的容量 切片容量是从它的第一个元素开始数,到其底层数组元素末尾的个数,如果是基于数组的...```go ch := make(chan int,100) //通道可以设置缓冲区,通过make的第二个参数指定缓冲区的大小 带缓冲区的通道允许发送端的数据发送和接收端的数据获取处于异步状态...,就是说发送端发送的数据可以放在缓冲区中,可以等待接收端去获取数据,而不是立刻需要接收端去获取数据 不过由于缓冲区的大小是有限的,还是需要有接收端来接收数据,否则缓冲区一满,数据发送端就无法再发送数据了

    19910

    Go 语言知识总结

    定义在指针上时,方法体中可以修改实例的成员变量。 定义在类型上时,修改实例的成员变量会因为值拷贝而失效。 不能同时定义在指针和类型上,否则会编译失败。...用 new 实现堆分配并创建指针。 数组名不是首元素指针。 指针不支持运算。 可用 unsafe 包打破安全机制来操控指针。   Go指针的应用场景: 使用指针实现作为参数,实现引用传递。...通道实现原理 通道创建时是在堆中创建了一个结构体,并返回指针,所以通道是引用类型。 通道结构体中主要包含:缓冲区循环数组,发送索引、接收索引、互斥锁、接收和发送的协程队列等。...当接收队列中存在阻塞协程时,缓冲区肯定是空的,发送端会直接复制数据到接收栈中,不会经过缓冲区也不需要加锁。...通过反射,可以获取类型、字段、方法等反射信息,可以修改字段值,支持数组、切片、map、指针、接口等复杂类型。使程序在运行期获得极为灵活的能力。

    27211

    Go 语言入门三部曲(一):能看懂 Go 语言

    指针保存了值的内存地址。 类型 *T 是指向 T 类型值的指针。其零值为 nil。 var p *int & 操作符会生成一个指向其操作数的指针。...而切片则为数组元素提供动态大小的、灵活的视角。在实践中,切片比数组更常用。 类型 []T 表示一个元素类型为 T 的切片。...} -5 17 12 ---- channel 缓冲区 通道可以设置缓冲区,通过 make 的第二个参数指定缓冲区大小: ch := make(chan int, 100) 带缓冲区的通道允许发送端的数据发送和接收端的数据获取处于异步状态...,就是说发送端发送的数据可以放在缓冲区里面,可以等待接收端去获取数据,而不是立刻需要接收端去获取数据。...如果通道带缓冲,发送方则会阻塞直到发送的值被拷贝到缓冲区内;如果缓冲区已满,则意味着需要等待直到某个接收方获取到一个值。接收方在有值可以接收之前会一直阻塞。

    49110

    实效go编程--2

    以下为数组在Go和C中的主要区别。在Go中, 数组是值。将一个数组赋予另一个数组会复制其所有元素。 特别地,若将某个数组传入某个函数,它将接收到该数组的一份副本而非指针。 数组的大小是其类型的一部分。...切片 切片通过对数组进行封装,为数据序列提供了更通用、强大而方便的接口。 除了矩阵变换这类需要明确维度的情况外,Go中的大部分数组编程都是通过切片来完成的。...其键可以是任何相等性操作符支持的类型, 如整数、浮点数、复数、字符串、指针、接口(只要其动态类型支持相等性判断)、结构以及数组。 切片不能用作映射键,因为它们的相等性还未定义。...T 的值, String 的接收者就必须是值类型的;上面的例子中接收者是一个指针, 因为这对结构来说更高效而通用。...例如 1而 math.Sin(math.Pi/4) 则不是,因为对 math.Sin 的函数调用在运行时才会发生。 在Go中,枚举常量使用枚举器 iota 创建。

    89670

    数据类型和表达式

    复合数据类型:Go中的复合数据类型包括数组、切片、映射、通道和结构体。...我们还展示了如何将指针类型转换为具体类型,并使用类型断言实现了该操作。 需要注意的是,在类型转换过程中可能会发生类型不匹配或溢出等问题,因此需要谨慎处理。...需要注意的是,在 Golang 中相等和不等运算符是 == 和 != 而不是 = 和 。 接下来我们展示了逻辑运算符的优先级,包括 && 和 ||。...类型断言:在Go中,可以通过类型断言操作符x.(T)将一个接口类型的值转换为具体类型的值,其中x表示要转换的值,T表示目标类型。...指针:指针是一种特殊类型的变量,存储了内存地址。在Go中,使用&操作符获取变量的地址,使用*操作符获取指针所指向的变量的值。指针可以用于传递函数参数、处理数据结构等方面。

    16410

    【建议收藏】吐血整理Golang面试干货21问-吊打面试官-1

    但并不是map,slice,chan的所有的变量在函数内都能被修改,不同数据类型的底层存储结构和实现可能不太一样,情况也就不一样。 问:讲讲Go的slice底层数据结构和一些特性?...答:Go的slice底层数据结构是由一个array指针指向底层数组,len表示切片长度,cap表示切片容量。slice的主要实现是扩容。...M从P中摘除,然后创建一个新的操作系统线程来服务于这个P,当M系统调用结束时,这个G会尝试获取一个空闲的P来执行,并放入到这个P的本地队列,如果这个线程M变成休眠状态,加入到空闲线程中,然后整个G就会被放入到全局队列中...make是用于引用类型(map,chan,slice)的创建,返回引用类型的本身,new创建的是指针类型,new可以分配任意类型的数据,返回的是指针。 问:Go中context 结构是什么样的?...内存逃逸的情况如下: 方法内返回局部变量指针。 向 channel 发送指针数据。 在闭包中引用包外的值。 在 slice 或 map 中存储指针。 切片(扩容后)长度太大。

    2.4K51

    最近的面试都在问些什么?

    go基础相关: slice和数组的区别 1.数组是定长的,是一片连续的内存,长度定义好后不能修改;切片是灵活的,可以动态扩容,切片是一个结构体,包括指向底层数组的指针、长度、容量; 2.作为参数传递时,...go引用类型有哪些? 指针、slice、map、channel、interface,上述引用类型不可比较,值类型可以比较。 两个结构体可以进行等值比较吗?...go interface interface定义了一组方法的集合,而不关心具体的实现。 多态性:允许不同的类型实现相同的方法。意味着可以使用接口类型来处理不同的对象,而不需要关心具体的类型。...如果结构体很小,或者不想让函数修改原始值,传值; 如果结构体很大,或者想要函数修改原始值,传指针; Python和Go的区别: 语言特性:python是一种动态强类型的解释型语言,Go是静态类型的编译型语言...唯一索引冲突:如果数据库表中有唯一索引,如主键或唯一约束,那么两个线程的插入操作中只有一个会成功,另一个会因为违反唯一性约束而失败;使用事务和select for update检查数据是否存在,在事务中锁定数据行

    12510

    make vs. new

    在Go编程中,make 和 new 是两个常用的内置函数,用于创建和初始化不同类型的数据结构。下面将简单介绍这两个函数以及它们的用法。...下面是 make 函数的基本语法: make(T, size) 其中,T 是数据结构的类型,如切片、映射或通道,而 size 是容量参数。...这有助于提高映射的性能,但不是必需的。...var i *int i = new(int) // 创建一个整数的指针,并将其赋给变量 i 3. make 与 new 的区别 1.返回类型不同:make 返回已初始化的数据结构,而 new 返回一个指向零值的指针...2.使用场景不同:make 用于切片、映射和通道的创建,而 new 用于创建自定义数据类型的实例。3.零值处理:make 返回的数据结构已被初始化,而 new 返回的指针指向零值。

    16320

    Go 语言学习指南:变量、循环、函数、数据类型、Web 框架等全面解析

    Functions 了解 Go 中函数的工作原理,下面的资源列表将涵盖: 如何在 Go 中定义和调用函数? Go 中的命名返回值? 处理多个返回类型。 Go 中不同类型的函数。...像数组一样,切片也用于在单个变量中存储相同类型的多个值。但与数组不同,切片的长度可以根据需要增长和缩小。...在 Go 中,每个并发任务都称为 Goroutines 具和协议。它们帮助您在开发Web应用程序时绕过一些操作,而不是每次都重新发明轮子。...使用协议缓冲区的一些优势包括: 紧凑的数据存储 快速解析 在许多编程语言中可用 通过自动生成的类进行优化功能 gRPC Go gRPC(gRPC Remote Procedure Call)的Go语言实现...它从API定义文件生成路由和序列化,让您专注于应用程序的逻辑,而不是考虑HTTP方法和路径以及JSON之类的琐事。

    26310

    对标 C + Python,明早我要会看 go 代码

    结构体 访问结构体成员 结构体作为函数参数 结构体指针 切片 Range Map 接口 并发 通道(channel) 通道缓冲区 遍历通道 记得上次这么豪横,还是在上次,对标 Python 上手 lua...byte 是uint8类型的等价类型,byte类型一般用于强调数值是一个原始的数据而不是 一个小的整数。 uintptr 是一种无符号的整数类型,没有指定具体的bit大小但是足以容纳指针。...几个常用函数: 常量 常量表达式的值在编译期计算,而不是在运行期。每种常量的潜在类型都是基础类型:boolean、string 或数字。...通过延迟明确常量的具体类型,无类型的常量不仅可以提供更高的运算精度,而且可以直接用于更多的 表达式而不需要显式的类型转换。 只有常量可以是无类型的。...,就是说发送端发送的数据可以放在缓冲区里面,可以等待接收端去获取数据,而不是立刻需要接收端去获取数据。

    91920

    掌握一门语言Go

    因为接收者为值类型时,修改的是Vertex的副本而不是原始值。...解答代码注释里的问题:因为我们实现接口方法的时候,绑定的是*Vertex而不是Vertex,所以必须是Vertex的指针类型才拥有该方法,如果使用Vertex的值类型而不是指针,则会报错“Vertex...下面再来一句话解释通道缓冲区。 缓冲区大小是可以发送到通道而没有发送阻塞的元素数。 这样的解释更加清晰了,就是通道有了缓冲区可以存放(通道作为接受者)一定大小的数据而不是直接进入阻塞。...我们在斐波那契函数中的循环次数为手动输入的通道的缓冲区大小,如果不是这样的话,发送次数超过了缓冲区大小就会报错。...for range循环在对通道c进行遍历的时候,它并不会自动按照c的缓冲区大小来循环,而是通道c被关闭以后,触发了for range循环的中止,而如果不是这样的话,通道一般是不需要被close的。

    1.1K90

    Go面经

    13.格式化输出 15.切片扩容 16.有无缓冲区chan 17.协程泄漏 18.Go 可以限制运行时操作系统线程的数量吗?...,不需要实现缓冲区和直接发送(Handoff)的语义;runtime.hchan包含缓冲区指针、元素个数、循环队列长度、发送操作处理到的位置、 接收操作处理到的位置、收发元素类型/大小、sendq 和...recvq 存储了当前 Channel 由于缓冲区空间不足而阻塞的 Goroutine 列 makechan 如果当前 Channel 中不存在缓冲区,那么就只会为 runtime.hchan 分配一段内存空间...; 如果当前 Channel 中存储的类型不是指针类型,会为当前的 Channel 和底层的数组分配一块连续的内存空间; 在默认情况下会单独为 runtime.hchan 和缓冲区分配内存;发送数据的过程中包含几个会触发...20.make和new make 和 new 关键字的实现原理,make 关键字的作用是创建切片、哈希表和 Channel 等内置的数据结构,而 new 的作用是为类型申请一片内存空间,并返回指向这片内存的指针

    37220

    Go 语言 15 个内置函数详解

    string 字符串中字节的个数。 channel 通道缓冲区中未读元素的个数,如果缓冲通道的值是 nil,len(v) 值的长度是 0。...*array 数组指针中元素的个数,数组指针的 cap(v) 和 len(v) 相等。 slice 切片可以容纳元素的最大长度,如果切片的值是 nil,该切片 cap(v) 值的容量是 0。...func make(t Type, size ...IntegerType) Type make 第一个参数是类型,而不是值;第二个参数是可选(变长)参数,整型类型的值,返回值是该类型的值本身。...和 make 相同,第一个参数是类型,而不是值; 和 make 不同,返回值是新分配的类型零值的指针。...注意:此处讲的在 defer 中调用 recover,是指在 defer 本身中,而不是任何被 defer 调用的函数中。

    64730

    Go 中数据类型和使用注意事项

    int // 底层数组容量 } Go语言中的 slice 陷阱:如何避免常见的错误 参考链接 在函数里修改切片元素的值,原切片的值也会改变(如果在函数内发生扩容,函数外的值不会改变...倍的规则扩容 Golang 的 Map 类型 不是线程安全的,避免并发的读写 Map,或者使用读写锁 或者 sync.map 解决这个问题 使用了链地址法解决 Hash 冲突 使用了增量扩容解决负载因子大于...,其将收到一个数组的拷贝,而不是它的指针) 数组的大小是其类型的一部分。...切片: 切片持有对底层数组的引用,如果你将一个切片赋值给另一个,二者都将引用同一个数组(如果函数接受一个切片参数,对切片的元素所做的改动,对于调用者是可见的,好比是传递了一个底层数组的指针) 字典: 和切片类似...recover可以清除本函数产生的 panic,让上游函数以为一切正常执行 Go 变量作用域 花括号来控制变量的作用域,花括号中的变量是单独的作用域,同名变量会覆盖外层 Golang 控制结构 select

    4400

    go 笔记

    接口:定义的一组方法的集合 go语言在面向对象的时,只有当需要修改对象的时候,才必须使用指针。它不是go语言的约束,而是一种自然约束。...func (a *Integer ) Add (b Integer) { retrun *a + b } ---- go 结构体中的字段还有一个 在变量类型后还有一个tag,作为可选项,要获取tag...多态:一种事物的多种形态,都可以按照统一的接口进行操作 类型断言:由于接口是一般类型,不知道具体类型,如果要转成具体类型,可以采用以下方法: var t int var x interface{} x...b. reflect.ValueOf ,获取变量的值,返回reflect.Value类型 c. reflect.Value.Kind 获取变量的类别(如返回struct),返回一个常量,注意类别和类型的区别...可以中字符串中获取空格分隔 带缓冲区的读写 bufio 关闭一个文件 defer file.Close() ---- Errorf和error.New ---- 进程是资源分配和调度的独立单位 线程是CPU

    42720

    Golang面试题

    ,它们被函数调用完之后会释放;引用类型是 slice、map、chan和值类型对应的指针 它们存储是一个地址(或者理解为指针),指针指向内存中真正存储数据的首地址,内存通常在堆分配,通过GC回收。...区别new 的参数要求传入一个类型,而不是一个值,它会申请该类型的内存大小空间,并初始化为对应的零值,返回该指向类型空间的一个指针。...在一个切片上存储指针或带指针的值 一个典型的例子就是 []*string,这会导致切片的内存逃逸,尽管其后面的数组在栈上分配,但其引用值一定是在堆上slice 的背后数组被重新分配了 因为 append...在Go中内存泄露分为暂时性内存泄露和永久性内存泄露。暂时性内存泄露,string相比切片少了一个容量的cap字段,可以把string当成一个只读的切片类型。...获取长string或者切片中的一段内容,由于新生成的对象和老的string或者切片共用一个内存空间,会导致老的string和切片资源暂时得不到释放,造成短暂的内存泄漏。

    1.7K92
    领券