[ GO语言基础语法 | 青训营笔记 ]
go语言介绍
Go 语言(或 Golang)起源于 2007 年,并在 2009 年正式对外发布。Go 是非常年轻的一门语言,它的主要目标是“兼具 Python 等动态语言的开发速度和 C/C++等编译型语言的性能与安全性” Go 语言是编程语言设计的又一次尝试,是对类C语言的重大改进,它不但能让你访问底层操作系统,还提供了强大的网络编程和并发编程支持。Go 语言的用途众多,可以进行网络编程、系统编程、并发编程、分布式编程。 Go 语言的推出,旨在不损失应用程序性能的情况下降低代码的复杂性,具有“部署简单、并发性好、语言设计良好、执行性能好”等优势,目前国内诸多 IT 公司均已采用 Go 语言开发项目。 Go 语言有时候被描述为“C 类似语言”,或者是“21 世纪的 C 语言”。Go 从 C 语言继承了相似的表达式语法、控制流结构、基础数据类型、调用参数传值、指针等很多思想,还有 C 语言一直所看中的编译后机器码的运行效率以及和现有操作系统的无缝适配。 因为 Go 语言没有类和继承的概念,所以它和 Java 或 C++ 看起来并不相同。但是它通过接口(interface)的概念来实现多态性。Go 语言有一个清晰易懂的轻量级类型系统,在类型之间也没有层级之说。因此可以说 Go 语言是一门混合型的语言。 此外,很多重要的开源项目都是使用 Go 语言开发的,其中包括 Docker、Go-Ethereum、Thrraform 和 Kubernetes。
Go语言的好处有:
- 性能比Python好
- C++不太适合在线Web业务
- 部署简单,学习成本低
- 内部RPC和HTTP架构的推广
基础语法
package main
import (
"fmt"
)
func main(){
fmt.Println("hello world")
}
变量
常见变量有字符串(内置),浮点型,整数,布尔型。
var main = "***"/*声明变量,:=相当于c语言的=*/
counst /*常量类型*/
if else
if 7%2 == 0 {
/*这个地方的if语句不用括号,同时需要紧接着{*/
fmt.Println("7 is even")
}else {
fmt.Println("7 is odd")
}
声明变量,:=相当于c语言的=*/
counst /常量类型/
/声明变量,:=相当于c语言的=/
counst /常量类型/
/这个地方的if语句不用括号,同时需要紧接着{/
for
for j:=7;j<9;j++{}
switch
case 1:
fmt.Println("one")
/*相比于c语言中的switch,go语言中的switch并不需要用break函数,在其中switch的运用也比c语言更加广泛。
/*相比于c语言中的switch,go语言中的switch并不需要用break函数,在其中switch的运用也比c语言更加广泛。
数组
var a [5] int /*声明数组*/
var arr1 [3] int = [3] int {1, 3, 5}
s[0] = "a"
s[1] = "b"
s[2] = "c"
s :=make([]string,3)
fmt.Println("get:".s[2]) //c
fmt.Println("len:",len(s)) //3
s = append(s,"d") // [a b c d ]
c : make([]string, len(s))
copy(c,s)
/*赋值语句*/
fmt.Println(s[1:3]) //[b c]
good := [] string{"g", "o", "o", "d"}
fmt.Println(good) // [g o o d]
/在使用append函数时需要append赋值回去/ var a [5] int /声明数组/
map
var a int
/*var 相当于声明存在一个a,具体的类型int整数之类可以说明,但是有相当于万金油都可以用*/
m: = make(map[string]int)
m["one"] = 1
m["one"] = 2
delete(m,"one") /*删除m,中one的字符*/
k, ok:=m["unknown"]
/*判断关键词k在不在字典unknown中在true/不在false*/
/var 相当于声明存在一个a,具体的类型int整数之类可以说明,但是有相当于万金油都可以用/
range 遍历
for i , num :=range nums{
sum += num
if num == 2{
fmt.Println("index",i,"num",num)// inex:0 num :2
}
/* i 相当于索引(函数循环次数), num 相当于对应索引i位置的值。不需要索引值可以用——下划线去忽略*/
/* i 相当于索引(函数循环次数), num 相当于对应索引i位置的值。不需要索引值可以用——下划线去忽略*/
函数
与其他语言不一样的是,goland语言中,变量类型是后置的是写在后面的
func add(a int, b int) int {
return a +b
}
func exists(m map[string] string, k string) (v string, ok bool){
v, ok = m[k]
return v, ok(返回两个值)
}
指针
用于强制转换
func add2(n int) {
n += 2
}
func add2ptr(n *int) {
*n += 2
}
func main() {
n := 5
add2(n)
fmt.Println(n) // 5
add2ptr(&n)
fmt.Println(n) // 7
}
结构体
func main() {
//var a user
a := user{name: "wang", password: "1024"}
b := user{"wang", "1024"}
c := user{name: "wang"}
c.password = "1024"
var d user
d.name = "wang"
d.password = "1024"
fmt.Println(a, b, c, d) // {wang 1024} {wang 1024} {wang 1024} {wang 1024}
fmt.Println(checkPassword(a, "1024")) // false
fmt.Println(checkPassword2(&a, "1024")) // false
}
func checkPassword(u user, password string) bool {
return u.password == password
}
func checkPassword2(u *user, password string) bool {
return u.password == password
}
错误提示
不同于java里面的异常,go语言能够很清晰的知道那个函数返回了错误,并且能够用简单的if-else语句去处理错误。在函数里面,我们可以在函数的返回类型里面加一个err error 代表函数能返回错误。在函数实现的时候,如果你要return,你就要return两个值。如果错误,就返回error.New函数来创建(在import里会有基础的error包)
func findUser(users []user, name string) (v *user, err error) {
for _, u := range users {
if u.name == name {
return &u, nil
}
}
return nil, errors.New("错误")
}