Go语言基础语法
什么是Go:
- 高性能, 高并发
- 丰富的标准库
- 完善的工具链
- 静态链接
- 快速编译
- 跨平台
- 垃圾回收
基础组成: 变量是后置的
- 包声明
- 引入包
- 函数
- 变量
- 语句 & 表达式
- 注释
package main
import "fmt"
func main() {
/* 这是我的第一个简单的程序 */
fmt.Println("Hello, World!")
}
(字符串可以通过+实现)
语言变量
- 声明变量的一般形式是使用var关键字, 可一次声明多个
var identifier1, identifier2 type
var b, c int = 1, 2
- 也可以用 :=
intVal := 1 相当于 var intVal int intVal = 1
语言常量
- 在程序运行时, 不会被修改的量, 用const
const identifier [type] = value
func main() {
var a = "initial"
var b, c int = 1, 2
var d = true
var e float64
f := float64(e)
g := a + "foo"
fmt.Println(a, b, c, d, e, f)
fmt.Println(g)
const s string = "contant"
const h = 50000
const i = 3e20
fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
}
基础语法
/*if后没有括号, 而且必须加大括号*/
if 7%2 == 0 {
fmt.Println("7 is even")
} else {
fmt.Println("7 is odd")
}
/*只有for循环, 什么都不写就是死循环*/
for {
fmt.Println("loop")
break
}
for j := 1; j < 3; j++ {
fmt.Println(j)
}
/*switch*/
a := 2
switch a {
case 1:
fmt.Println("one")
case 2:
fmt.Println("two")
default:
fmt.Println("other")
}
数组
var a [5]int
a[4] = 100
fmt.Println(a[4], len(a))
/*切片可以看作是一个可变长的数组*/
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println(len(s))
// 可以用append, 注意要赋值回去
s = append(s, "d")
fmt.Println(s)
// 可以用copy复制
c := make([]string, len(s))
copy(c, s)
fmt.Println(c)
// 也有substring操作
fmt.Println(s[1:3])
Map
是完全随机的
// 一个是key的类型, 一个是val的类型
m := make(map[string]int)
m["one"] = 1
m["two"] = 2
fmt.Println(m) //map[one:1 two:2]
// 判断key是否存在
r, ok := m["unknown"]
fmt.Println(r, ok) //0 false
// 删除
delete(m, "one")
m2 := map[string]int{"one" : 1, "two" : 2}
函数
变量类型都是后置的
func add(a int, b int) int {
return a + b
}
func add2(a, b int) int {
return a + b
}
// 注意这里返回值也是有两个v和ok
func exists(m map[string]string, k string) (v string, ok bool) {
v, ok = m[k]
return v, ok
}
func main() {
res := add(1, 2)
fmt.Println(res)
v, ok := exists(map[string]string{"a": "A"}, "a")
fmt.Println(v, ok)
}
指针
// 这个+2是没用的, 因为传入的参数是copy
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
}
结构体
type user struct {
name string
password string
}
func main() {
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"
}
**func checkPassword(u user, password string) bool {
return u.password == password
}**
// 指针用法, 可以对结构体进行修改
func checkPassword2(u *user, password string) bool {
return u.password == password
}
结构体方法
func main() {
a := user{name: "wang", password: "1024"}
a.checkPassword("1024")
}
**// 这里改成了结构体方法
func (u user) checkPassword(password string) bool {
return u.password == password
}**
错误处理
用单独的返回值反映
// 返回值里面加一个error变量
func findUser(user []user, name string) (v user, err error) {
for _, u := range users {
if u.name == name {
return u, nil
}
}
return nul, errors.New("not found")
}