
golang
唐火
开始人工智能之路了!!!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Go中使用Set
创建了一个空的map,它的键是字符串类型,值是空结构体类型,用来表示集合。:向这个map中添加了一个键"hello",并将值设置为一个空结构体,表示键"hello"存在。通过这种方式,map的键"hello"被添加到集合中,但不存储任何额外的信息,仅仅表示该键的存在性。这种方式常用于实现集合(set)的功能。原创 2024-12-12 19:37:13 · 352 阅读 · 0 评论 -
[Go]泛型
fmt.Println("Hello, 世界")// ~ 代表只要底层满足这些类型也可以算满足约束。原创 2024-10-20 10:14:23 · 345 阅读 · 0 评论 -
[Go]汇总一下 for 和 for range 中最容易迷惑的几段代码
这段代码 for 循环不会一直循环,原因是,arr 会在 range 一个复制一份儿,这个复制体的 len 在最初的 range 中的开头已经确定是 3,后面继续追加的 arr,并不会改变这个最初读取的 len == 3 这个结果。这段代码是存在 bug 的,&v,首先,根据作用域可知道,这个 v 是 loop 级作用域,那么这个 result 中存在的&v 就是同一个值,所以这个代码是错误的。使用这种传统的 for 循环,因为 n 在循环体和循环内部都是同一个,所以循环不会结束。原创 2024-10-20 00:19:22 · 204 阅读 · 0 评论 -
[Go]断言
当使用空接口作为类型参数的时候,空接口已经充盈了一个动态类型,如果我们要将这个空接口类型转化为原来的类型就需要断言。原创 2024-10-19 22:49:30 · 189 阅读 · 0 评论 -
[Go]类型嵌入来完成继承
我们可以看到,直接嵌入的时候,其实是省略了写法。s 是指针类型和值类型在调用实质上还是区别的,但是在实际使用中,并不会有什么区别,这主要还是因为要看方法是定义在值类型还是指针类型上。不过即便 s 是值的时候,people 上本身是定义在指针上的方法,那么它在底层调用的时候也势必是 *People。但是如果 s 这里是指针类型的话,那么它调用的就是 *People 的方法 +*Address 的方法。当发生嵌入类型和本类型,字段重合的时候,优先调用本类型的字段,嵌入类型的只需要加上前缀就可以了。原创 2024-10-19 21:34:30 · 291 阅读 · 0 评论 -
[Go]for-range 字符串
因为对一个字符串使用 range 的时候,go 默认使用 utf8 的编码方式,但是 string 的底层是[]byte 的存储方式,所以直接 range 的时候,将这个时候的字符转化为字符就会发生乱码的情况。1.直接获取 value 值。原创 2024-10-19 20:04:18 · 263 阅读 · 0 评论 -
[Go]字符串的基础知识
【代码】[Go]字符串的基础知识。原创 2024-10-19 19:47:50 · 135 阅读 · 0 评论 -
[Go]切片中的 range 注意事项
并且,在 range 的时候,range 后面的数据其实也是复制品,也就是说,这里的 := range result result 也是复制品,原有的 result 如何变化都不会影响 range 结果。是会一直 range 吗?如果是函数,函数体的变量 s 和函数内部的 s 就是同一个,显然,range 中,range 后面的 s 和 range 里面的 s 并不是同一个。range 时,我们直接修改返回的值是不会生效的,因为返回的值并不是原始的数据,而是数据的复制。原创 2024-10-19 19:27:25 · 222 阅读 · 0 评论 -
[Go]结构体嵌套可能带来的问题
不必要的方法 嵌套整个 WaitGroup 会让 Pool 结构体拥有 Add/Done/Wait 等方法,但 Pool 可能只需要 Wait 就够了。名称冲突 如果 Pool 结构体中还定义了 Add/Done/Wait 方法,和嵌套的 WaitGroup 中的方法就会产生冲突。使结构体臃肿 嵌套整个 WaitGroup 会让 Pool 结构体看起来很臃肿,包含许多其实用不到的方法。否则,使用字段的方式可以获得必要的功能,而不引入嵌套的潜在问题。直接嵌套还是作为字段。原创 2024-10-19 18:34:27 · 218 阅读 · 0 评论 -
[Go]空结构体
通常,当我们需要一个临时的变量时,我们可以会想到设置一个 bool 类型,因为我们潜意识中感觉一个 bool 类型是比较小的,但是一个空的变量才是最小的,下面让我们看一个例子,这个例子发生在使用 channel 传递信息这个场景。需要注意的是,一个空的结构体,表示它类型的方式是 struct{},而使用这个空结构体的方式就是 struct{}{},前面的大括号是跟 struct 一起的整体表示空结构体,后面的大括号表示一个空结构体类型的结构体调用。原创 2024-10-19 15:46:02 · 209 阅读 · 0 评论 -
[Go]匿名 struct
通过这个演示我们发现,其实嵌入更像是一种语法糖,它就跟将结构体当作类型,前面的结构体字段变量跟这个类型保持一致这种操作是同样的作用,只不过直接嵌入可以将嵌入的字段当作自己的字段,省略了中间的变量罢了,它有下面的等于关系。函数也可以将指针类型当作类型以及直接嵌入,与非指针相比,我们不能直接调用嵌入的结构体的字段,因为它目前还是 nil,这个时候我们必须先将结构体初始化,然后再进行操作,下文的代码有演示。这段代码跟上文看起来很像,但是一个是将 people 直接嵌入,一个是当成了它的一个字段类型。原创 2024-10-19 15:05:24 · 234 阅读 · 0 评论 -
[Go]零值不可用
这个问题的解释是这样的:互斥锁是带有状态的,就是说,当你复制的时候本来是 a 的状态,然后复制过去还是 a 的状态,但是这是一个新的对象了按道理应该是初始状态,所以就会出现错误,这也是传说中的重入锁 (go 不支持),因为 go 的互斥锁是带有状态的,所以这种复制的方法就会出现错误。但是,如果对 mu 进行值的复制就不能使用了。这段代码是可以正常使用的。原创 2024-10-19 14:28:38 · 185 阅读 · 0 评论 -
[Go]枚举常量 iota
iota 是 go 语言的一个预定义标识符,它表示 const 声明块中,每一个常量所处位置的偏移量,它本身也是一个无类型的常量,它的初始值是 0,意思是说此处的 iota 跟第一行比偏移了 0 个位置。答案就是异类输出自己的,其它的常量不受影响,比如这里的输出就是 0 12 2 3 4 5 6,只要记住 iota 是偏移位置就可以理解为什么是这么输出的了。如果不考虑常量的灵活性,极致追求安全性,那么也可以给 iota 常量加上类型。如果要让 iota 的初始值是 1,那么可以这么做。原创 2024-10-19 14:20:17 · 216 阅读 · 0 评论 -
[Go]小心 shadow 的变量
在外层,a 已经提前声明,但是在 if 这个作用域中,由于 err 并未提前声明,所以使用了 :=,由于系统无法获知这里的 a 是否需要再次声明,所以 go 语言默认 a 是一个新的变量,这样外层的 a 就无法得到新的值,外层 a 也就被内层的 a 给 shadow 了。原创 2024-10-19 13:56:35 · 167 阅读 · 0 评论 -
[Go]在使用 Go Modules(go mod)时,如果你遇到类似 ‘protoc-gen-doc‘ 不是内部或外部命令,也不是可运行的程序 的错误
在使用 Go Modules(go mod)时,如果你遇到类似 ‘protoc-gen-doc’ 不是内部或外部命令,也不是可运行的程序 的错误,通常是因为 protoc-gen-doc 插件没有正确安装,或者没有被添加到系统的 PATH 环境变量中。原创 2024-10-18 22:12:04 · 294 阅读 · 0 评论