Golang基础

=和:=的区别

  • =是赋值
  • :=是声明+赋值

指针的作用

指针用来保存变量的地址

  • 解引用计算符*用于访问地址中的值
  • 地址运算符&用于返回变量的地址

Go允许多个返回值吗

允许,返回两个string。

func swap(x,y string) (string, string)

Go有异常类型吗

没有异常类型,只有错误类型

什么是协程(Goroutine)

Goroutine可以被认为是轻量级的线程。与线程相比,创建Goroutine的开销很小。

如何高效的拼接字符串

利用strings.Builder

什么是rune类型

rune是int32类型的别称,是Unicode编码的别称。Go语言中字符串的底层表示是byte(8 bit)序列,而不是rune(32 bit)序列。正常情况下中文会使用uft-8编码,每个中文字符需要3byte

fmt.Println(len("Go语言")) //8
fmt.Println(len([]rune("Go语言"))) //4

将字符串转换为[]rune可以进行准确的子串截取

如何判断map中是否包含某个key

if val, ok := dict["foo"]; ok {
	//do something here
}

ok为true代表存在包含key的value

Go支持默认参数或可选参数吗

Go不支持默认参数和可选参数

如何实现默认参数和可变参数

  • 创建一个结构体类型来封装相关的参数,并在函数中接受指向该结构体的指针。这样可以在结构体定义中为字段提供默认值,调用者可以选择性地初始化部分或全部字段。
  • 使用变长参数,虽然变长参数本身并不直接提供默认值,但可以结合函数内部逻辑来实现类似功能。通过检查传入的参数数量,可以决定是否使用预设的默认值。

defer的执行顺序

  • 多个 defer 语句,遵从后进先出(Last In First Out,LIFO)的原则,最后声明的 defer 语句,最先得到执行。
  • defer在return语句之后执行,return中存在表达式时会先计算表达式的值之后赋值给返回变量,之后开始执行defer

如何交换2个变量的值

a, b := "A", "B"
a, b = b, a

Go语言tag的用处

tag 可以理解为 struct 字段的注解,可以用来定义字段的一个或多个属性。框架/工具可以通过反射获取到某个字段定义的属性,采取相应的处理方式。tag 丰富了代码的语义,增强了灵活性。

如何判断2个字符串切片(slice)是否相等

  • 可以通过reflect.DeepEqual(a, b)判断a、b两个切片是否相等,但是通常不推荐这么做,使用反射非常影响性能。
  • 通常采用的方式如下,遍历比较切片中的每一个元素

字符串打印时,%v 和 %+v 的区别

%v 和 %+v 都可以用来打印 struct 的值,区别在于 %v 仅打印各个字段的值,%+v 还会打印各个字段的名称。

Go 语言中如何表示枚举值(enums)

使用const和iota来进行

type StuType int32
const (
	Type1 StuType = iota
    Type2
    Type3
    Type4
)

空struct{}的用途

  • 使用空结构体 struct{} 可以节省内存,一般作为占位符使用,表明这里并不需要一个值。
  • 比如使用 map 表示集合时,只关注 keyvalue 可以使用 struct{} 作为占位符。如果使用其他类型作为占位符,例如 intbool,不仅浪费了内存,而且容易引起歧义。
  • 再比如,使用信道(channel)控制并发时,我们只是需要一个信号,但并不需要传递值,这个时候,也可以使用 struct{} 代替。
  • 再比如,声明只包含方法的结构体
tag(s): none
show comments · back · home
Edit with Markdown
召唤看板娘