美文网首页
Go语言常见问题

Go语言常见问题

作者: 周山 | 来源:发表于2024-06-27 12:23 被阅读0次

    变量类

    • nil 只能赋值给指针、chan、func、interface、map 或 slice 类型的变量。
      error 类型,它是一种内置接口类型,所以也能赋值nil
    type error interface {
        Error() string
    }
    
    • Go 是强类型语言
    • 在Go语言中,结构体中的map[string]string类型不能直接进行比较。map[string]string类型是一个动态的键值对集合,它的值可以是任何类型的值,因此不能直接比较。比较这两个结构体中的map[string]string值。一种方法是使用reflect包中的DeepEqual函数来比较两个map的值。
    • 相同类型的结构体才能够进行比较,结构体是否相同不但与属性类型有关,还与属性顺序相关,
    • append() 的第二个参数不能直接使用 slice,需使用 … 操作符,将一个切片追加到另一个切片上
    • 显式初始化是指在声明变量时,直接为变量分配一个初始值。这种初始化方式通常用于需要初始化值为特定值的情况。

    在这个例子中,你试图将一个变量L添加到一个已存在的切片中。但是,你并没有为L分配一个初始值,所以编译器会报错。为了解决这个问题,你需要显式地为L分配一个初始值。例如:

    L := []int{}
    L = append(L, ...)
    
    

    与显式初始化相对应的是默认初始化。默认初始化是指在声明变量时,为变量分配一个默认值。这种初始化方式通常用于需要变量有一个默认值的情况。
    例如,在声明一个整数变量时,如果没有显式地指定初始值,那么它将被初始化为0:

    var i int
    

    在这个例子中,i被显式地初始化为0。如果你不显式地初始化i,那么它将被默认初始化为0。

    • 字符串连接
    str := "abc" + "123"
    fmt.Sprintf("abc%d", 123)
    

    除了以上两种连接方式,还有 strings.Join()、buffer.WriteString()等。

    new() 与 make() 的区别

    new(T) 会为 T 类型的新值分配已置零的内存空间,并返回地址(指针),即类型为 *T的值。换句话说就是,返回一个指针,该指针指向新分配的、类型为 T 的零值。适用于值类型,如数组、结构体等。
    make(T,args) 返回初始化之后的 T 类型的值,这个值并不是 T 类型的零值,也不是指针 *T,是经过初始化之后的 T 的引用。make() 只适用于 slice、map 和 channel.

    编译、初始化相关操作

    • defer 的执行顺序是后进先出。当出现 panic 语句的时候,会先按照 defer 的后进先出的顺序执行,最后才会执行panic
    • init() 函数是用于程序执行前做包的初始化的函数,比如初始化包里的变量等;
    • 一个包可以出线多个 init() 函数,一个源文件也可以包含多个 init() 函数;
    • 同一个包中多个 init() 函数的执行顺序没有明确定义,但是不同包的init函数是根据包导入的依赖关系决定的(看下图);
    • init() 函数在代码中不能被显示调用、不能被引用(赋值给函数变量),否则出现编译错误;
    • 一个包被引用多次,如 A import B,C import B,A import C,B 被引用多次,但 B 包只会初始化一次;
    • 引入包,不可出现死循坏。即 A import B,B import A,这种情况编译失败;


      image.png

    相关文章

      网友评论

          本文标题:Go语言常见问题

          本文链接:https://www.haomeiwen.com/subject/bdvxwdtx.html