Co语言语法基础
高性能、高并发
语法简单、学习曲线平缓
丰富的标准库
完善的工具链
静态链接
快速编译
跨平台
垃圾回收
package main import ( "net/http" ) func main() { http.Handle("/", http.FileServer(http.Dir("."))) http.ListenAndServe(":8080", nil) }
Go语言属于强类型语言
switch语法中的每个case语句后不用添加break语句,一旦匹配自动跳出结构
switch可以使用任何的变量类型,如字符串和结构体,甚至可以用来取代任意的if-else语句
案例
package main
import (
"fmt"
"time"
)
func main() {
a := 2
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
case 3:
fmt.Println("three")
case 4, 5:
fmt.Println("four or five")
default:
fmt.Println("other")
}
t := time.Now()
switch {
case t.Hour() < 12:
fmt.Println("It's before noon")
default:
fmt.Println("It's after noon")
}
}
相较于数组,Go语言开发中使用切片的次数更多
切片是一个可变长度的数组,可以任意更改长度,使用make()创建一个切片,
make函数用于创建切片、映射(map)和通道(channel)切片是 Go 语言中一种非常灵活和强大的数据结构,它允许你动态地添加、删除和访问元素。切片的底层是一个数组,但它提供了更高级的功能和便利性。
在 Go 语言中,
append函数用于向切片的末尾添加一个或多个元素。append函数的第一个参数是要操作的切片s,第二个参数是要添加的元素"d"。append函数会返回一个新的切片,这个新切片包含了原来的切片s的所有元素以及新添加的元素"d"。需要注意的是,如果原来的切片s的底层数组没有足够的容量来容纳新的元素,append函数会自动创建一个新的底层数组,并将原来的数组内容复制到新的数组中,然后再添加新的元素。
copy(c, s)是 Go 语言中的一个内置函数,用于将一个切片(slice)的元素复制到另一个切片中。在这个例子中,它的作用是将切片s中的元素复制到切片c中。具体来说,
copy(c, s)会从切片s的第一个元素开始,逐个复制到切片c中,直到填满切片c或者切片s中的元素全部被复制完毕。如果切片c的长度小于切片s的长度,那么只有切片c长度的元素会被复制;如果切片c的长度大于切片s的长度,那么切片s中的所有元素都会被复制,而切片c中剩余的位置将保持其原始值(零值)。package main import "fmt" func main() { s := make([]string, 3) s[0] = "a" s[1] = "b" s[2] = "c" fmt.Println("get:", s[2]) fmt.Println("len:", len(s)) s = append(s, "d") s = append(s, "e", "f") fmt.Println(s) c := make([]string, len(s)) copy(c, s) fmt.Println(c) fmt.Println(s[2:5]) fmt.Println(s[:5]) fmt.Println(s[2:]) good := []string{"g", "o", "o", "d"} fmt.Println(good) }答案: get: c len: 3 [a b c d e f] [a b c d e f] [c d e] [a b c d e] [c d e f] [g o o d]
创建map
m := make(map[string]int)
string 是键的数据类型, int是值的数据类型
m["one"] = 1
使用上面的语句可以向map集合中赋值
Go语言的map集合中元素是无序的
r, ok := m["unknown"]
fmt.Println(r, ok)
定义一个结构体
type user struct {
• name string
• password string
}
if err != nil {
• panic(err)
}
这段代码是一个错误处理的代码片段,它的作用是在程序发生错误时,通过调用
panic函数来抛出一个异常,从而导致程序崩溃。这种方式通常用于处理不可恢复的错误,例如无法连接到数据库、文件系统错误等。在这个特定的代码片段中,
err是一个错误对象,如果它的值不是nil,则表示发生了错误。panic函数会接受一个任意类型的值作为参数,并将其作为错误信息输出,然后程序会停止执行。这种错误处理方式的优点是简单直接,可以快速定位问题。但是,它也有缺点,因为它会导致程序崩溃,这在某些情况下可能不是我们想要的。例如,如果程序是一个服务器程序,我们可能希望它能够在遇到错误时记录错误日志并继续运行,而不是崩溃。
因此,在实际的编程中,我们应该根据具体情况选择合适的错误处理方式。如果错误是可以恢复的,我们应该尝试恢复并继续执行;如果错误是不可恢复的,我们可以选择记录错误日志并优雅地停止程序。
协程:用户态,轻量级线程,栈KB级别 线程:内核态,线程跑多个协程,栈MB级别
通过go关键字来开启一个协程
go语言提倡通过通信共享内存
make(chan 元素类型,[缓冲大小])
- 无缓冲通道 make(chan int)
- 有缓冲通道 make(chan int, 2)
无缓冲通道是同步的