golang基础

154 阅读11分钟
  1. Golang中的指针是什么?有什么作用?

答:在 Golang 中,指针是一个变量,它存储了一个值的内存地址。在 Golang 中,可以使用 & 操作符获取一个值的地址,可以使用 * 操作符解引用指针并访问存储在该地址中的值。

指针在 Golang 中具有以下几个作用:

  1. 通过指针可以在函数之间传递数据,这样可以避免大量的数据复制,提高程序的性能。
  2. 通过指针可以直接访问内存,可以更加灵活地操作数据结构,例如链表、树等。
  3. 通过指针可以创建新的数据类型,例如 Golang 中的 slice 和 map 类型就是基于指针实现的。
  4. 通过指针可以在函数中修改传入的参数的值,从而实现函数的副作用。

需要注意的是,在 Golang 中,指针可以为空值(nil),这是一个特殊的指针值,表示指针没有指向任何有效的内存地址。如果一个指针为空值,则解引用该指针将导致运行时错误。因此,在使用指针时,需要格外小心,确保指针始终指向有效的内存地址。

  1. Golang中的变量类型有哪些?它们有什么特点?

答:Golang 中的变量类型可以分为以下几类:

  1. 布尔类型(bool):表示 true 或 false。

  2. 数值类型:

    a. 整数类型(int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64):表示不同大小和符号的整数。

    b. 浮点数类型(float32, float64):表示单精度和双精度浮点数。

    c. 复数类型(complex64, complex128):表示单精度和双精度复数。

  3. 字符串类型(string):表示 UTF-8 字符串。

  4. 字符类型(rune):表示单个 UTF-8 字符。

  5. 错误类型(error):表示错误信息。

  6. 接口类型(interface):表示一组方法的集合。

  7. 数组类型(array):表示一组具有相同类型和长度的值。

  8. 切片类型(slice):表示一个动态大小的数组。

  9. 字典类型(map):表示一个无序的键值对集合。

  10. 结构体类型(struct):表示一个具有一组字段的数据结构。

  11. 指针类型(*T):表示一个指向 T 类型变量的指针。

  12. 函数类型(func):表示一个函数。

这些变量类型在 Golang 中都具有一些特点:

  1. Golang 中的变量类型都具有确定的大小和类型。
  2. Golang 中的变量类型都可以使用字面量直接初始化。
  3. Golang 中的变量类型都可以进行类型转换。
  4. Golang 中的变量类型都支持取地址和解引用操作。
  5. Golang 中的变量类型都支持运算符和函数的操作。

需要注意的是,Golang 中的变量类型都具有严格的类型检查,这意味着在不同类型之间进行赋值或操作时,需要进行显式的类型转换,否则会编译错误。

  1. Golang中的常量和变量有什么区别?

答:Golang 中的常量和变量都是用于存储程序中的值的,它们之间的主要区别如下:

  1. 值的不可变性:常量是值不可变的,一旦被定义,就不能再次修改。而变量的值可以被多次修改。
  2. 声明和初始化:常量在定义时必须被初始化,一旦被定义,就不能再次赋值。而变量可以在定义时不进行初始化,也可以在程序运行时被多次赋值。
  3. 可见性:常量和变量都具有作用域,但常量的作用域只能是全局的。而变量的作用域可以是全局的、局部的或者函数参数。
  4. 类型:常量的类型是根据值的类型推断得出的,而变量必须显式声明类型。
  5. 内存分配:常量在编译时被分配内存,而变量在运行时被分配内存。
  6. 命名规则:常量的命名一般采用全大写字母和下划线的方式,而变量的命名一般采用驼峰命名法。

需要注意的是,Golang 中的常量和变量都具有类型检查机制,这意味着在进行赋值或操作时,需要确保类型相同或进行显式的类型转换,否则会编译错误。

  1. Golang中的基本数据类型有哪些?它们的范围和精度是多少?

答:Golang 中的基本数据类型包括布尔类型、整数类型、浮点数类型、复数类型、字符串类型、字符类型和错误类型。它们的范围和精度如下:

  1. 布尔类型(bool):只有两个值,true 和 false。

  2. 整数类型(int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64):表示不同大小和符号的整数。范围和精度根据类型不同而不同,具体如下:

    a. int 和 uint 类型的大小取决于程序运行的操作系统,一般情况下是 32 位或 64 位整数。

    b. int8 和 uint8 类型的范围是 -128 到 127 和 0 到 255,占用 8 位。

    c. int16 和 uint16 类型的范围是 -32768 到 32767 和 0 到 65535,占用 16 位。

    d. int32 和 uint32 类型的范围是 -2147483648 到 2147483647 和 0 到 4294967295,占用 32 位。

    e. int64 和 uint64 类型的范围是 -9223372036854775808 到 9223372036854775807 和 0 到 18446744073709551615,占用 64 位。

  3. 浮点数类型(float32, float64):表示单精度和双精度浮点数。范围和精度根据类型不同而不同,具体如下:

    a. float32 类型的精度约为 6 位小数,可以表示大约 1.18E-38 到 3.4E+38 的浮点数。

    b. float64 类型的精度约为 15 位小数,可以表示大约 2.23E-308 到 1.8E+308 的浮点数。

  4. 复数类型(complex64, complex128):表示单精度和双精度复数。实部和虚部都是浮点数类型。范围和精度根据类型不同而不同,与对应的浮点数类型相同。

  5. 字符串类型(string):表示 UTF-8 字符串。字符串可以包含任意数量的字符,每个字符占用一个字节以上的空间。

  6. 字符类型(rune):表示单个 UTF-8 字符。可以使用单引号或 Unicode 码点来表示字符。

  7. 错误类型(error):表示错误信息。用于处理程序中可能出现的错误情况。

需要注意的是,在进行计算时,需要根据数据类型的范围和精度来选择合适的类型,以免发生精度丢失或溢出的情况。同时,Golang 中的数据类型都支持运算符和函数的操作,可以满足不同场景的需求。

  1. Golang中的字符串是如何处理的?有哪些字符串操作函数? 答:Golang 中的字符串是一个不可变的 UTF-8 字符序列,可以使用双引号或反引号来定义字符串字面值。由于字符串是不可变的,所以修改字符串的操作会创建一个新的字符串,原字符串不会被改变。Golang 中的字符串采用 Unicode 编码,因此支持多种语言和字符集,可以表示任何字符。

Golang 提供了许多字符串操作函数,包括:

  1. len(str string) int:返回字符串的字节数。
  2. strings.Contains(s, substr string) bool:判断字符串 s 是否包含子字符串 substr。
  3. strings.Count(s, sep string) int:计算字符串 s 中有多少个不重叠的子字符串 sep。
  4. strings.HasPrefix(s, prefix string) bool:判断字符串 s 是否以指定的前缀 prefix 开头。
  5. strings.HasSuffix(s, suffix string) bool:判断字符串 s 是否以指定的后缀 suffix 结尾。
  6. strings.Index(s, sep string) int:查找字符串 s 中子字符串 sep 的第一个出现位置,不存在则返回 -1。
  7. strings.LastIndex(s, sep string) int:查找字符串 s 中子字符串 sep 的最后一个出现位置,不存在则返回 -1。
  8. strings.Replace(s, old, new string, n int) string:将字符串 s 中前 n 个 old 替换为 new。
  9. strings.Split(s, sep string) []string:使用 sep 作为分隔符将字符串 s 分割为字符串数组。
  10. strings.ToLower(s string) string:将字符串 s 转换为小写字母。
  11. strings.ToUpper(s string) string:将字符串 s 转换为大写字母。
  12. strconv.Itoa(i int) string:将整数 i 转换为字符串。
  13. strconv.Atoi(s string) (int, error):将字符串 s 转换为整数。
  14. fmt.Sprintf(format string, a ...interface{}) string:将格式化字符串和参数 a 转换为字符串。

需要注意的是,Golang 中的字符串操作函数都是针对字符串本身的操作,不会修改原始字符串,而是返回一个新的字符串。此外,由于字符串是不可变的,所以字符串操作函数都会创建新的字符串对象,因此需要注意内存开销的问题。 6. Golang中的数组和切片是什么?它们有什么区别? 答:在 Golang 中,数组和切片都是用于存储一组相同类型的元素的数据结构,但它们有很大的区别。

  1. 数组(array):数组是一种固定长度的数据结构,声明时需要指定长度,数组长度不可改变。数组的元素类型必须相同,可以是任意基本数据类型或自定义类型。数组是值类型,赋值或传递给函数时会进行复制。数组通常用于存储固定长度的数据,例如存储年龄的数组。
  2. 切片(slice):切片是一个可变长度的序列,声明时不需要指定长度,使用内置的 make 函数可以创建一个指定长度的切片。切片的元素类型必须相同,可以是任意基本数据类型或自定义类型。切片是引用类型,它包含一个指向底层数组的指针、切片的长度和容量信息。切片可以动态增长和缩小,可以使用 append() 函数向切片末尾添加元素。切片通常用于存储可变长度的数据,例如存储学生的成绩。

区别:

  1. 长度:数组长度固定,不可改变,而切片长度可变。
  2. 值传递:数组是值类型,赋值或传递给函数时会进行复制,而切片是引用类型,传递给函数时只是传递了指向底层数组的指针,修改切片会影响底层数组。
  3. 内存管理:数组是静态分配的,存储在栈上,而切片是动态分配的,存储在堆上,需要垃圾回收器回收。
  4. 使用场景:数组通常用于存储固定长度的数据,而切片通常用于存储可变长度的数据,例如存储不定数量的数据、处理流式数据等。

综上所述,数组和切片在 Golang 中都有自己的使用场景和优缺点,需要根据实际情况进行选择。 7. Golang中的map是什么?如何使用map?

在 Golang 中,map 是一种无序的键值对集合,也称为关联数组、字典或哈希表。map 中的每个元素由一个键和一个值组成,键必须是唯一的,值可以是任意类型。

使用 map 可以方便地进行数据的存储、查找和更新,是 Golang 中常用的数据结构之一。下面是使用 map 的基本步骤:

  1. 声明 map 变量:使用 var 声明一个 map 变量,并指定键和值的类型。例如:

    var m map[string]int   // 声明一个键为 string 类型,值为 int 类型的 map 变量
    
  2. 初始化 map:可以使用 make 函数来初始化一个空的 map。例如:

    m = make(map[string]int)   // 初始化一个空的 map
    

    也可以在声明时进行初始化,例如:

    m := map[string]int{"a": 1, "b": 2, "c": 3}   // 初始化一个包含三个元素的 map
    
  3. 操作 map:使用中括号([])来访问和操作 map 中的元素。例如:

    m["a"] = 10        // 设置键为 "a" 的元素值为 10
    val := m["b"]     // 获取键为 "b" 的元素值
    delete(m, "c")    // 删除键为 "c" 的元素
    

    还可以使用 range 关键字遍历 map 中的元素,例如:

    for key, val := range m {
        fmt.Println(key, val)
    }
    

    上述代码会依次输出 map 中的每个元素的键和值。

需要注意的是,由于 map 是无序的,遍历 map 的元素顺序可能会随机变化。同时,由于 map 的值是动态分配的,需要使用 make 函数进行初始化,否则会出现空指针异常。

综上所述,map 是 Golang 中常用的一种数据结构,可以方便地进行数据的存储和查找,同时也需要注意其使用的细节。