Golang中使用自定义类型的内置函数解析

Golang中使用自定义类型的内置函数解析 我不太清楚内置函数何时可以与用户定义类型一起使用的规则。具体来说,如果我创建一个像 type T1 []int 这样的类型,我应该在哪里查找才能知道可以对类型 T1 使用 append 函数?

5 回复

同样有效

return make(Int32Set)

更多关于Golang中使用自定义类型的内置函数解析的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我很惊讶这段代码在没有显式转换的情况下能够编译通过:

type Int32Set map[int32]bool

func NewInt32Set() Int32Set {
    return make(map[int32]bool)
}

这由语言规范的可赋值性规则所涵盖,特别是:

在以下任一条件适用时,值 x 可被赋值给类型为 T变量(“x 可赋值给 T”):

  • x 的类型 VT 具有相同的底层类型,并且 VT 中至少有一个不是已定义类型。

在你的例子中,x 的类型 V 是 map[int32]bool不是已定义类型),而 T 是 Int32Set,其底层类型是 map[int32]bool,因此上述条件确实适用。

你好 @kanishka,欢迎来到论坛。

append 内置函数适用于切片,而 T1 是一个底层类型为切片的类型,因此 append 同样适用于 T1

一般来说,如果一个内置函数适用于某个特定类型,并且一个自定义类型将该类型作为其底层类型,那么该内置函数也应该适用于该自定义类型。

对于围绕特定核心语言特性的问题,如果你不介意稍微搜索一下并连接不同的部分,Go 语言参考是你的好帮手。

例如,append这里有描述(在其他内置函数中),而自定义类型和底层类型在这里(在“类型定义”小节中)有所提及。

如果有疑问,不妨试试看…

在Go语言中,内置函数对自定义类型的支持取决于类型定义的方式。对于 type T1 []intappend 函数可以直接使用,因为 T1 的底层类型是切片。以下是具体解析和示例:

规则解析

  1. 底层类型匹配:如果自定义类型的底层类型是内置函数支持的类型(如切片、映射、通道),则可以直接使用对应的内置函数。
  2. 类型声明方式
    • type T1 []intT1 是切片类型,支持 appendlencap 等。
    • type T2 intT2 是基本类型,支持算术运算,但不直接支持内置函数(如 append 不适用)。

示例代码

package main

import "fmt"

type T1 []int

func main() {
    var t T1 = []int{1, 2, 3}
    // 直接使用 append 内置函数
    t = append(t, 4, 5)
    fmt.Println(t) // 输出: [1 2 3 4 5]
    
    // 支持 len 和 cap
    fmt.Println(len(t), cap(t)) // 输出: 5 6
}

内置函数支持的自定义类型范围

  • 切片类型:支持 appendlencapcopy
  • 映射类型:支持 lendelete
  • 通道类型:支持 lencapclose
  • 其他类型:如数组、结构体等,仅支持 lencap(若为数组或指向数组的指针)。

查找方法

  1. 查看Go语言规范中“Built-in functions”部分,确认函数支持的参数类型。
  2. 验证自定义类型的底层类型是否匹配函数要求。例如,append 的第一个参数必须是切片类型(包括自定义切片类型)。

注意事项

  • 如果自定义类型通过结构体封装切片(如 type T3 struct { s []int }),则不能直接使用 append,需通过字段操作。
  • 类型别名(type T4 = []int)与原始类型完全等效,所有内置函数行为一致。

通过以上规则和示例,可以明确内置函数在自定义类型上的使用条件。

回到顶部