Go语言基础——内置函数

news/2024/7/5 3:45:39

Go语言基础

目录

  • Go语言基础
  • 内置类型
      • 值类型:
      • 引用类型:(指针类型)
  • 内置函数
  • 内置接口error

内置类型

值类型:

   bool
    int(32 or 64), int8, int16, int32, int64
    uint(32 or 64), uint8(byte), uint16, uint32, uint64
    float32, float64
    string
    complex64, complex128
    array    -- 固定长度的数组

引用类型:(指针类型)

  slice   -- 序列数组(最常用)
    map     -- 映射
    chan    -- 管道

内置函数

  • make():用于创建一个新的slice、map或channel。make()函数的参数包括要创建的类型、长度和容量等。
    // 创建一个长度为5,容量为10的slice
    s := make([]int, 5, 10)
    fmt.Println(len(s)) // 5
    fmt.Println(cap(s)) // 10
    
    // 创建一个长度为5,容量为5的map
    m := make(map[string]int, 5)
    m["one"] = 1
    fmt.Println(m) // map[one:1]
    
    // 创建一个容量为10的channel
    c := make(chan int, 10)
    c <- 1
    fmt.Println(<-c) // 1
    
  • append():用于向slice中添加元素。如果slice的容量不足,append()函数会自动扩容。
    // 向slice中添加元素
    s := []int{1, 2, 3}
    s = append(s, 4, 5, 6)
    fmt.Println(s) // [1 2 3 4 5 6]
    
  • len():用于获取slice、map、string、array和channel等类型的长度。
    s := []int{1, 2, 3, 4, 5}
    fmt.Println(len(s)) // 5
    
    m := map[string]int{"one": 1, "two": 2, "three": 3}
    fmt.Println(len(m)) // 3
    
    str := "hello"
    fmt.Println(len(str)) // 5
    
    arr := [5]int{1, 2, 3, 4, 5}
    fmt.Println(len(arr)) // 5
    
    c := make(chan int, 10)
    c <- 1
    fmt.Println(len(c)) // 1
    
  • cap():用于获取slice、array和channel等类型的容量。
    s := []int{1, 2, 3, 4, 5}
    fmt.Println(cap(s)) // 5
    
    arr := [5]int{1, 2, 3, 4, 5}
    fmt.Println(cap(arr)) // 5
    
    c := make(chan int, 10)
    fmt.Println(cap(c)) // 10
    
  • copy():用于复制slice中的元素到另一个slice中。
    
    s1 := []int{1, 2, 3, 4, 5}
    s2 := make([]int, len(s1))
    copy(s2, s1)
    fmt.Println(s2) // [1 2 3 4 5]
    
  • close():用于关闭一个channel。
    c := make(chan int, 10)
    c <- 1
    close(c)
    fmt.Println(<-c) // 1
    _, ok := <-c
    fmt.Println(ok) // false
    
  • delete():用于删除map中的元素。
    m := map[string]int{"one": 1, "two": 2, "three": 3}
    delete(m, "two")
    fmt.Println(m) // map[one:1 three:3]
    
  • panic()和recover():用于处理Go语言的异常。
    func test() {
        defer func() {
            if err := recover(); err != nil {
                fmt.Println("panic:", err)
            }
        }()
        panic("test panic")
    }
    
    func main() {
        test()
        fmt.Println("after test")
    }
    // 输出:panic: test panic
    
    这是因为在test()函数中调用了panic()函数,导致程序发生了异常,然后通过defer语句中的匿名函数实现了异常的捕获和处理。具体地,defer语句会将一个匿名函数压入函数调用栈中,等待当前函数执行完毕后再执行该匿名函数。在本例中,匿名函数中使用了recover()函数来捕获异常,并将异常信息输出到控制台。由于recover()函数只有在defer语句中才能生效,因此需要将其放在defer语句中。最后,main()函数继续执行,输出了after test
  • print()和println():用于输出内容到终端。
    name := "Alice"
    age := 20
    fmt.Print("My name is ", name, ", and I'm ", age, " years old.")
    // 输出:My name is Alice, and I'm 20 years old.
    
    fmt.Println("My name is ", name, ", and I'm ", age, " years old.")
    // 输出:
    // My name is Alice, and I'm 20 years old.
    // (自动换行)
    

内置接口error

  type error interface { //只要实现了Error()函数,返回值为String的都实现了err接口

            Error()    String

    }

可以看到,error接口只包含了一个Error()方法,该方法返回一个字符串类型的错误信息。因此,如果我们想要自定义一个错误类型,只需要实现Error()方法即可。

以下是一个自定义错误类型的示例,该错误类型表示除数为0的错误:

type DivideError struct {
    dividend int
    divisor  int
}

func (de *DivideError) Error() string {
    return fmt.Sprintf("error: divide %d by %d", de.dividend, de.divisor)
}

func divide(dividend, divisor int) (int, error) {
    if divisor == 0 {
        return 0, &DivideError{dividend, divisor}
    }
    return dividend / divisor, nil
}

func main() {
    result, err := divide(10, 0)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Println(result)
    }
}

在该示例中,我们定义了一个DivideError结构体,该结构体包含了被除数和除数两个变量。然后,我们为该结构体定义了一个Error()方法,用于返回除数为0的错误信息。接着,我们定义了一个divide()函数,该函数用于计算两个数的商,并返回计算结果和错误信息。如果除数为0,则返回一个DivideError类型的错误。最后,在main()函数中调用divide()函数,如果返回的错误不为空,则输出错误信息;否则输出计算结果。

总之,error接口是Go语言中一个非常常用的接口,用于表示错误信息。在实际开发中,我们经常会使用error接口来自定义错误类型,并将错误信息返回给调用者。通过合理地使用error接口,我们可以提高程序的容错能力和健壮性。


http://lihuaxi.xjx100.cn/news/1162715.html

相关文章

Scala学习(六)---apply方法和单例对象

文章目录 1.Apply方法2.单例模式 1.Apply方法 Scala中实例化一个类&#xff0c;可以不用new &#xff0c; 其原因 其实就是 apply 方法 apply方法的调用约定&#xff1a; 用括号传递给类实例或者单例对象名一个或者多个对象的时候 scala会在对应的类或者对象中查找apply方法 且…

数值计算 - 常用函数值计算方法

秦九韶算法 什么是秦九韶算法&#xff1f; 可以把多项式改写为便于递推的形式&#xff1a; 泰勒展开式 什么是泰勒展开式&#xff1f; 泰勒公式&#xff0c;也称泰勒展开式。是用一个函数在某点的信息&#xff0c;描述其附近取值的公式。如果函数足够平滑&#xff0c;在已知函…

如何避免孩子独自在家偷偷使用电脑?

电脑为我们的生活带来了极大的便利&#xff0c;但是对于孩子来说&#xff0c;过早的接触网络很容易影响其健康的成长。家长在家的话&#xff0c;还可以监督孩子&#xff0c;但如果家长出门了&#xff0c;该如何避免孩子偷偷使用电脑呢&#xff1f;其实方法很简单&#xff0c;只…

Halcon中从两组点的对应关系生成仿射矩阵,及思考原理和代码实现

有几个算子有点类似&#xff0c;看了下区别 1.vector_to_rigid( : : Px, Py, Qx, Qy : HomMat2D) 2.vector_to_similarity( : : Px, Py, Qx, Qy : HomMat2D) 3.vector_to_aniso( : : Px, Py, Qx, Qy : HomMat2D) vector_to_rigid 这个是刚性变换&#xff0c; 只有旋转和平移…

你知道黑客是什么样?

1 前言 现代人的生活离不开互联网&#xff0c;提到互联网人们总会想到一个词&#xff0c;那就是黑客。对于黑客大家对他们的了解却只局限于电影、电视中他们“无处不在”的可怕和他们“翻手为云覆手为雨”的技术中。但真正的黑客到底是什么&#xff1f; 2 什么是黑客 笔挺的…

Ubuntu 18 设置时钟同步

Ubuntu 18自带了systemd-timesyncd服务来同步时钟&#xff0c;可以使用以下步骤来进行配置&#xff1a; 打开终端窗口&#xff0c;进入root用户权限&#xff1a;sudo su。 检查系统当前的时钟同步状态&#xff1a; timedatectl 如果输出类似下面的信息&#xff0c;表示NTP同步功…

基于InVEST模型的人类活动、重大工程生态成效评估、论文写作

查看原文>>>基于生态系统服务&#xff08;InVEST模型&#xff09;的人类活动、重大工程生态成效评估、论文写作 【学习目标】&#xff1a; 1) 采用InVEST模型&#xff0c;掌握产水&#xff08;包括水源涵养&#xff09;、碳存储&#xff08;包括固碳&#xff09;、土…

一些题的题解

一、 洛谷 B2137 判决素数个数 题目描述 求 X X X&#xff0c; Y Y Y 之间的素数个数&#xff08;包括 X X X 和 Y Y Y&#xff09;。 输入格式 两个整数 X X X 和 Y Y Y&#xff08; 1 ≤ X , Y ≤ 1 0 5 1 \le X,Y \le 10^5 1≤X,Y≤105&#xff09;。 输出格式 …