2025-11-27
golang
00

相关信息

golang基础学习

  • 字符串的小问题
go
①可以用==比较 ②不可以通过下标的方式改变某个字符,字符串是只读的 ③不能和nil比较
  • 数组定义问题 数组是可以通过下标定义的。case:
js
array := [...]int{1,2,3,9:34} 表示array[9]==34len(array)就是10
  • Go 支持什么形式的类型转换? 支持显示类型的转换
  • 空结构体
js
js
不包含任何字段的结构体叫做空结构体 struct{} 定义: var et struct{} et := struct{}{} type ets struct {} / et := ets{} / var et ets 特性: * 所有的空结构体的地址都是同一地址,都是zerobase的地址,且大小为0 使用场景: * 用于保存不重复的元素的集合,Go的map的key是不允许重复的,用空结构体作为value,不占用额外空间。 * 用于channel中信号传输,当我们不在乎传输的信号的内容的时候,只是说只要用信号过来,通知到了就行的时候,用空结构体作为channel的类型 * 作为方法的接收者,然后该空结构体内嵌到其他结构体,实现继承
  • 如何停止一个goroutine
js
for - select方法,采用通道,通知协程退出 ②采用context包
  • Go 语言中 cap 函数可以作用于哪些内容? 数组、切片、通道
  • Printf(),Sprintf(),FprintF() 都是格式化输出,有什么不同?
js
Printf()是标准输出,一般用于打印。 Sprintf()把格式化字符串输出到字符串,并返回 FprintF()把格式化字符串输出到实现了io.witer方法的类型,比如文件
  • golang中new和make的区别
js
共同点:都会分配内存空间(堆上) 不同点: ①作用变量不同,new可以为任意类型分配内存;但是make只能给切片、map、chan分配内存 ②返回类型不同,new返回的是指向变量的指针;make返回的是上边三种变量类型本身 ③new对分配的内存清零;make会根据你的设定进行初始化,比如在设置长度、容量的时候
  • golang中所有传参都是值传递
js
Go语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。因为拷贝的内容有时候是非引用类型(int、string、struct等这些),这样就在函数中就无法修改原内容数据;有的是引用类型(指针、map、slice、chan等这些),这样就可以修改原内容数据。
  • context的使用场景
js
context的主要作用:协调多个 groutine 中的代码执行“取消”操作,并且可以存储键值对。最重要的是它是并发安全的。 ① 可以存储键值对,供上下文(协程间)读取【建议不要使用】 ② 优雅的主动取消协程(Cancel)。主动取消子协程运行,用不到子协程了,回收资源。比如一个http请求,客户端突然断开了,就直接cancel,停止后续的操作; ③ 超时退出协程(Timeout),比如如果三秒之内没有执行结束,直接退出该协程; ④ 截止时间退出协程(Deadline),如果一个业务,2点到4点为业务活动期,4点截止结束任务(协程)
  • rune学习
js
import ( "fmt" "unicode/utf8" ) func main() { var str = "hello 世界" //golang中string底层是通过byte数组实现的,直接求len 实际是在按字节长度计算 所以一个汉字占3个字节算了3个长度 fmt.Println("len(str):", len(str)) //以下两种都可以得到str的字符串长度 //golang中的unicode/utf8包提供了用utf-8获取长度的方法 fmt.Println("RuneCountInString:", utf8.RuneCountInString(str)) //通过rune类型处理unicode字符 fmt.Println("rune:", len([]rune(str))) } // 结果为 12 8 8 fmt.Println(string([]rune(str)[7:])) //就能取出‘界’

golang中string底层是通过byte数组实现的。中文字符在unicode下占2个字节,在utf-8编码下占3个字节,而 golang默认编码正好是utf-8。 所以len计算的时候,一个中文字符占用3个字节。 而转换为rune计算,就刚好能得到字符的实际个数,比如我们想取出‘界’,rune的方式就很友好

  • 逃逸问题

一般我们给一个引用类对象中的引用类成员进行赋值,可能出现逃逸现象。可以理解为访问一个引用对象实际上底层就是通过一个指针来间接的访问了,但如果再访问里面的引用成员就会有第二次间接访问,这样操作这部分对象的话,极大可能会出现逃逸的现象。

  • make or new 对于引用类型的变量,我们不光要声明它,还要为它分配内容空间,否则我们的值放在哪里去呢
js
new 用来开分配内存,同时返回一个指向该类型内存地址的指针。同时请注意,它同时把分配的内存置为零,也就是类型的零值 make 用来为map chan slice分配内存,但是返回的是类型本身,而不是指针类型,因为他们本身就已经是引用类型,不需要再进行指针返回了 相同点 - 堆空间分配 不同点 - make: 只用于slice、map以及channel的初始化, 无可替代 - new: 用于类型内存分配(初始化值为0), 不常用

image.png

  • 开闭原则 简单的说就是在修改需求的时候,应该尽量通过扩展来实现变化,而不是通过修改已有代码来实现变化。
  • 虚拟内容的作用
js
虚拟内存的目的是为了解决以下几件事: (1)物理内存无法被最大化利用。 (2)程序逻辑内存空间使用独立。 (3)内存不够,继续虚拟磁盘空间。
  • nil
js
nil 可以用作 interface、function、pointer、map、slice 和 channel 的“空值” 但是如果不特别指定的话,Go 语言不能识别类型

本文作者:曹子昂

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!