Go语言是什么?有什么特性?
- 高性能:
Go语言被称为一种高性能的编程语言兼具面向过程和面向对象特性的编程语言。它提供了接近C语言的性能,同时保持了较高的抽象层次。Go语言的编译器会生成高效的机器码,并且垃圾回收机制也得到了优化,采用了并发标记清除算法,这个算法将内存对象分为可达和不可达两类,通过标记所有可达对象来识别出不可达对象,并将其回收,以减少对性能的负面影响。 - 高并发:
Go语言在并发编程方面表现出色。它的goroutines是一种轻量级的线程,开销非常小,可以轻松地创建大量goroutines来处理并发任务。此外,Go语言的channels提供了一种安全而高效的方式来在goroutines之间传递数据,从而避免了传统线程编程中的许多复杂性。这使得Go语言非常适合编写需要处理大量并发连接或任务的应用程序,如Web服务器、微服务、分布式系统等。 - 语法简洁:
Go语言的语法相对简洁,这使得代码更加易读和易写。简洁的语法减少了编写和阅读代码时的认知负担,从而提高了开发效率。此外,Go语言的代码风格也鼓励了清晰和一致的编程实践,这有助于减少错误和提高代码质量。 - 学习曲线平缓:
Go语言的设计者注重让语言易于学习和使用。Go语言的语法和语义相对简单,没有像其他语言那样复杂的特性或语法糖。这使得初学者能够更快地掌握Go语言,并将其应用于实际项目中。同时,Go语言的文档和社区资源也非常丰富,为学习者提供了良好的支持。 - 丰富的标准库:
Go语言的标准库非常强大且全面,提供了许多常用的功能和数据结构。这些标准库经过了广泛的测试和优化,确保了它们的性能和可靠性。开发者可以依赖这些标准库来构建高效的应用程序,而无需从头开始实现这些功能。 - 完善的工具链:
Go语言拥有一个完善的工具链,包括编译器、链接器、调试器、测试框架等。这些工具为开发者提供了全面的支持,从编写代码到调试和测试,再到部署和监控。这些工具链的集成和易用性使得Go语言成为了一种非常适合快速开发和迭代的语言。 - 静态链接:
Go语言的编译过程包括静态链接,这意味着所有的依赖项(包括标准库和第三方库)都会在编译时被打包到最终的可执行文件中。这有助于减少运行时对外部库的依赖,并提高应用程序的可移植性和安全性。 - 快速编译:
Go语言的编译器非常高效,能够快速地编译代码。这使得开发者能够在短时间内看到代码更改的效果,从而加快了开发过程。此外,Go语言的编译过程还支持增量编译,即只编译发生更改的部分,从而进一步缩短了编译时间。
基础语法
变量声明
两种方法:
- var name (type)=value
- name:=(type)value 示例
var a ="abc"
var b int =12
vare e float 64 //明确了变量 `e` 的类型是 `float64`
f:=float32(e) // 声明一个float32类型的变量f,并将e的值转换为float32后赋给f
选择结构
if-else
if 7%2 == 0 {
fmt.Println("7 is even")}
else {
fmt.Println("7 is odd")
}
分支结构
switch-case 特点:在c++里面,switch case 如果不不显示加 break 的话会然后会继续往下跑完所有的 case, 在go语言里面的话是不需要加 break的。
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")
}
循环结构
在go语言中只有for循环没有其他的while循环do while循环,可以使用break或者continue来跳出或者继续循环
for
{
fmt.Println("loop")
break
}
for j:= 7;j< 9;j++{fmt.Println(j)
for n:=0;n<5;n++ {
if n%2 == 0
{continue }
fmt.Println(n)}
for i <= 3 {fmt.Println(i)
i=i+1}
数组
由于长度固定 在go语言的实际应用中其实不常用 最常用的其实是切片
var a [5]int
a[4]= 100
fmt.Println(a[4],len(a))
切片
在go lang 中slice的存储原理是存储一个长度加一个容量加一个数组的指针 使用append增加元素的时候如果检查到容量不够就会发生扩容然后返回一个新的slice 所以新的值都应该重新复制给原来的变量才能完成元素的增加 当然也可以直接指定长度
s := make([]string, 3)
s[0]="a"
s[1]="b"
s[2]="c"
fmt.Println("get:",s[2]) //c
fmt.Println("len:",len(s))// 3
s = append(s, "d" )
s = append(s, "e",“f”)
copy(c,s)
fmt.Println(c)//[abcdef]
fmt.Println(s[2:5]) // [c d e)
fmt.Println(s[:5])//[abcde]
fmt.Println(s[2:])// [cdef]
good :=[]string{"g","o","o","d"}
fmt.Println(good)// [g o o d]
"d"}
map
使用过程中使用最频繁的数据结构 golang中的kv对是完全无序的输出的时候随机输出
m := make(map[string]int)//string是key的类型int是value的类型
m["one"]= 1
m["two"]=2
fmt.Println(m)map["one":1,"two":2]
fmt.Println(len(m))//2
fmt.Println(m["one"])//1
fmt.Println(m["unknow"])//0
r,ok := m["unknow"]fmt.Println(r,ok)//0 false
delete(m, "one" )
m2 := map[string]int{"one":l,"two":2}
var m3 = map[string]int{"one":1,"two": 2}
fmt.Println(m2, m3)
range
一般用range来快速遍历slice和map,对于数组的话会返回两个值,第一个是索引,第二个是对应位置的值。如果我们不需要索引的话,我们可以用下划线来忽略。