【面试题】Golang (第一篇)

目录

1.Golang有哪些优势?

2.Golang数据类型有哪些?

3.Golang中的包如何使用?

4.Go支持什么形式的类型转换?

5.什么是Goroutine?你如何停止它?

协程/线程

如何创建goroutine?

如何停止goroutine?

1.使用channel

2.使用context

3. 使用Mutex和WaitGroup

4. 使用runtime包

6.Context

1.什么是context

2.context的接口方法

3.context树

3.1context.WithCancel 取消多个 goroutine

3.2 context.WithValue 传值

3.3 context.WithTimeout 超时取消

3.4Context 使用原则

3.5Context底层原理

7.如何在运行时检查变量类型?

8.Go两个接口之间可以存在什么关系?

9.Go的同步锁有什么特点?作用是什么?


1.Golang有哪些优势?

高效性:Go语言是一种编译型语言,能够生成高效的机器码。同时,Go语言的垃圾回收机制和协程支持使其在处理大规模并发任务时非常高效。

并发性:Go语言内置支持协程和通道,能够方便地编写并发程序。协程可以轻松实现高并发,通道可以方便地进行通信和同步,这使得Go语言在网络编程、分布式系统和大数据处理等领域具有优势。

简单性:Go语言语法简洁,容易学习和理解。Go语言没有继承和多态等复杂的语言特性,使得程序设计更加直观和简单。

可读性:Go语言具有良好的代码风格和格式,使得代码易于阅读和维护。Go语言的代码组织方式和注释规范使得代码的可读性和可维护性得到保证。

安全性:Go语言具有内置的安全特性,如内存安全、类型安全和并发安全等。Go语言的垃圾回收机制可以避免内存泄露,类型安全可以防止代码中出现类型错误,而并发安全可以避免数据竞争问题。

跨平台性:Go语言的编译器可以将源代码编译为本地机器码,使得程序可以在各种操作系统上运行。同时,Go语言标准库中提供了许多与平台无关的包,如网络、文件操作等,可以方便地编写跨平台的程序。

总之、Go语言具有高效性、并发性、简单性、可读性、安全性和跨平台性等优势,使得它在云计算、网络编程、分布式系统、大数据处理等领域得到了广泛应用。

2.Golang数据类型有哪些?

1、布尔型,值只可以是常量true或false;bool

2、数字类型,支持整型和浮点型数字,并且支持复数;int、int8、int16、int32、int64;uint、uint8、uint16、uint32、uint64;float32、float64;complex64、complex128

3、字符串类型,是一串固定长度的字符连接起来的字符序列;string

4、指针类型;var 变量名 *基础类型 如:var p *int

5、数组类型; var 数组名 [数组大小]数据类型 如:

var arr1 [5]int =[5]int{1,2,3,4,5}

var arr2 = [5]int{1,2,3,4,5}

var arr3 = [...]int{1,2,3,4,5}

var arr4=[...]int{2:66,0:22,3:88}

6、结构化类型; type 结构体名称 struct {} 如:

type Teacher struct{

Name string

Age int

}

var t1 Teacher = Teacher{"测试",20}

var t2 *Teacher = new(Teacher)

7、Channel类型;var 变量名 chan int 如:

var intchan chan int

intchan = make(chan int,3)

intchan<-10

8、函数类型;func 函数名(形参列表)(返回值类型列表){执行语句... return +返回值列表} 如:

func main() int{

...

return 0

}

9、切片类型;var 切片名 []类型 = 数组中的一个片段引用 如:

var intattr [6]int = [6]int{1,2,3,4,5,6}

slice:=intattr[1:3] //切片

slice1:=make([]int,4,20) //make函数的三个参数:1.切片类型 2.切片长度 3.切片容量

10、接口类型;type 接口名称 interface{ 方法 }如:

type Sayhello interface {

sayHello()

}

11、Map类型。var 变量名 map[keytype]valuetype 如:

var a map[int] string

a = make(map[int]string,10)

a[1000] = "测试1"

a[1001] ="测试2"

3.Golang中的包如何使用?

什么是Golang包?

包是一组相关函数、类型和变量的集合,在代码中起到一种组织结构的作用。与其他语言中的库或者模块类似,包可以实现代码的复用和模块化。所有Golang程序都要使用包,包的导入可以在源代码的头部进行声明

如何使用Golang包?

使用Golang包需要三个步骤:导入包、访问包中的函数或者变量以及调用这些函数或者使用这些变量。如:

package main
import (
       "fmt"
        "math/rand"
)
func main(){
    fmt.Println("My favoriate number is",rand.Intn(10))
}

这个例子中使用了fmt 和math/rand包。该程序打印了从0到9之间的随机整数。其中rand.Intn函数用于获取随机数。在导入包后,我们可以通过包的名称来访问其函数和变量。例如,我们使用rand.Intn调用Intn函数。

如何创建自己的包?

我们也可以创建自己的golang包。以下是创建自己的包的步骤:

1.创建一个包目录

我们可以在任何目录下创建一个golang包,但是最好在我们的工作区目录树中创建它。我们的工作区目录树必须包含src目录,其中包含我们的所有go源文件。

例如,我们可以在工作区目录树/src/myutils下创建一个新的包目录。

2.将功能代码放入包中

我们将我们的代码放到包目录下的一个或多个.go文件中。这些文件必须在包声明的同一目录下。

例如,在myutils目录下创建一个myutils.go文件,并在其中添加以下代码:

package myutils
import "fmt"
//函数名必须是大写其他包中才可以使用
func SayHello(){
    fmt.Println("hello,world")
}

3.在其他代码中使用自己的包

我们可以像使用任何其他包一样使用我们的包。我们可以使用import语句导入它,然后使用它的函数和变量。

例如,在我们的主程序中,我们可以使用以下代码:

package main
​
import "myutils"
​
func main(){
    myutils.SayHello()
}
​

4.Go支持什么形式的类型转换?

  1. 基本类型转换

  2. 自定义类型转换

一、基本类型转换

在golang中,包括int、float、string等等在内的基本类型都支持类型转换,开发人员可以使用内置的转换函数将一个基本类型转换成另一个基本类型。

1.整型类型转换

在golang中,整型类型包括int8、int16、int32、int64、uint8、uint16、uint32、uint64等等。当我们需要将一个整型变量从一个类型转换成另一个类型时,可以使用内置的转换函数。

下面以将int32类型转换为int64类型为例:

var a int64 = 100
var b int32
b = int32(a)
fmt.Println(a, b)

2.浮点型类型转换

在golang中,浮点型类型包括float32和float64,将一个浮点型变量从一个类型转换成另一个类型时,同样可以使用内置的转换函数。

下面以将float32类型转换为float64类型为例:

var a float32= 100.00 var b float64 b = float32(a) fmt.Println(a, b)

3.字符串类型转换

将一个字符串转换为其它类型的变量也比较常见,golang提供了内置的转换函数,如下:

a := "1234"
b, err := strconv.Atoi(a)   //将字符串转换成int类型的变量
c, err := strconv.ParseFloat(a,64)  //将字符串转换成float64类型的变量
d := strconv.Itoa(1234)   //将int类型的变量转换成字符串
e := strconv.FormatFloat(3.14159, 'E', -1, 64)  //将float64类型的变量转换成字符串`

二、自定义类型转换

在golang中,自定义类型也可以进行类型转换,只需要实现相应的类型转换函数即可。

在自定义类型上进行类型转换需要满足一定的条件,具体如下:

1.自定义类型T必须是一个类型

2.类型T有一个底层类型,且底层类型不能是指针或接口类型

3.底层类型与T之间可以进行相互转换

<

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的小猴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值