变量
两种声明方式
var a = "initial"
var b, c int = 1, 2
g := a + "foo"
常量
把var变成const即可,会自动确定类型
const s string = "constant"
const h = 50
循环
只有for循环
for {
}
for i := 0; i < 9; i++ {
}
for i <= 3 {
}
switch
不需要加break,可以使用任意的变量类型,可以取代任意的if else
数组
很少直接用数组,更多用切片
var a [5]int
b := [5]int{1, 2, 3, 4, 5}
var c [2][3]int
切片
可变长度的数组,有类似Python的切片操作
s := make([]string, 3)
s[0] = "a"
s[1] = "b"
s[2] = "c"
s = append(s, "d")
s = append(s, "e", "f")
c := make([]string, len(s))
copy(c, s)
fmt.Println(s[2:5]) // [c d e]
切片与数组的区别:解密 Go 语言中数组和切片的奥秘:深入剖析它们的区别 - 掘金 (juejin.cn)
range
对于数组或map,可以用range快速遍历
nums := []int{2, 3, 4}
for i, num := range nums {
}
m := map[string]string{"a": "A", "b": "B"}
for key, value := range m {
}
函数
原生支持返回多个值,在实际项目中,几乎都是返回多个值。第一个值是真正的返回值,第二个值是错误信息
func exists(m map[string]string, k string)(v string, ok bool){ //前面是参数,后面是返回值
v, ok = m[k]
return v, ok
}
指针
与C语言形式类似
func add2ptr(n *int) {
*n += 2
}
add2ptr(&n)
结构体
用法类似C
type user struct {
name string
password string
}
a := user{name: "wang", password: "1024"}
b := user("wang", "1024"}
c := user{name: "wang"}
c.password = "1024"
结构体方法
类似成员函数
在func关键字后面插入结构体变量就可以创建结构体方法,使用指针可以修改结构体
func (u user) checkPassword(password string) bool {
}
func (u *user) resetPassword(password string) {
}
错误处理
使用单独的返回值来传递错误信息,可以很清晰的知道是哪个函数返回了错误,并且可以用if else来处理错误。可以在函数的返回值里面加入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("not found")
}
u, err := findUser{[]user{{"wang", "1024"}}, "wang"}
if err != nil {
fmt.Println(err)
return
}
fmt.Println(u.name)
字符串操作
a := "hello"
fmt.Println(strings.Contains(a, "ll")) //是否包含
fmt.Println(strings.Count(a, "l")) //字符串计数
fmt.Println(strings.HasPrefix(a, "he")) //判断开头
fmt.Println(strings.HasSuffix(a, "llo")) //判断结尾
fmt.Println(strings.Index(a, "ll")) //查找位置
fmt.Println(strings.Join([]string{"he", "llo"}, "-")) //连接多个字符串
fmt.Println(strings.Repeat(a, 2)) //重复多个字符串
fmt.Println(strings.Replace(a, "e", "E", -1)) //替换
fmt.Println(strings.Split("a-b-c", "-")) //切片
fmt.Println(strings.ToLower(a))
fmt.Println(strings.ToUpper(a))
fmt.Println(len(a))
b := "你好"
fmt.Println(len(b))
true
2
true
true
2
he-llo
hellohello
hEllo
[a b c]
hello
HELLO
5
6
格式化输出
类似C中的printf,但是可以用%v代表任意变量,%+v可以打印出字段名,%# v可以打印出整个构造的类型名称、字段名称和值
type point struct {
x, y int
}
func main() {
s := "hello"
n := 123
p := point{1, 2}
fmt.Println(s, n)
fmt.Println(p)
fmt.Printf("s=%v\n", s)
fmt.Printf("n=%v\n", n)
fmt.Printf("p=%v\n", p)
fmt.Printf("p=%+v\n", p)
fmt.Printf("p=%#v\n", p)
f := 3.1415
fmt.Printf("%.2f\n", f)
}
hello 123
{1 2}
s=hello
n=123
p={1 2}
p={x:1 y:2}
p=main.point{x:1, y:2}
3.14