golang基础语法 | 青训营

85 阅读3分钟

golang基础语法

基础变量

定义变量 可变量:var 不可变量:const 基本变量和c,c+,java一样

import (
	"fmt"
	"math"
)

func main() {
	//可变量
	var a = "initial"
	var b, c int = 1, 2 //这里指定bc为int类型
	var d = true        //java,c里面的boolean类型
	var e float64
	f := float32(e) //类型转换

	g := a + "for" //golang的字符串可以直接用“+”号连接
	fmt.Println(a, b, c, d, e, f)
	fmt.Println(g)

	//不可变量
	const s string = "strings"
	const h = 1000000
	const i = 3e20 / h
	fmt.Println(s, h, i, math.Sin(h)) //调用math包里面的函数,sin,cos
}

## if_else 和c,java不一样的地方是if——else没有(),注意!!! eg:


import (
	"fmt"
)

func main() {

	//和c,java不一样的地方是if——else没有(),注意
	if 5%2 == 0 {
		fmt.Println("是基数")
	} else {
		fmt.Println("是偶数")
	}

	if 8%4 == 0 {
		fmt.Println("is divisible by 4")
	}

	if num := 9; num < 0 {
		fmt.Println(num, "is negative")
	}

}

for循环没有什么区别

		if n%2 == 0 {
			continue
		}
		fmt.Println(n)
	}

switch case

这里有个很大的一点不同的是,在c++里面,switch case如果不显示加break的话会然后会继续往下跑完所有的case,在golang里面的话是不需要加break的。 go语言里面的switch功能更强大。可以使用各种类型,甚至可以用来取代if_else

	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("Wrong")
	}
	t := time.Now()
	switch {
	case t.Hour() < 12:
		fmt.Println("It's before noon")
	default:
		fmt.Println("It's after noon")
	}

数组

和java,c区别也不大

	arr[4] = 100
	fmt.Println(arr[4], len(arr))

	b := [5]int{1, 2, 3, 4, 5}
	fmt.Println(b)

	var two [2][3]int
	for i := 0; i < 2; i++ {
		for j := 0; j < 3; j++ {
			two[i][j] = i + j
		}
	}
	fmt.Println("2d:", two)

range 一种新的遍历数组方式,map

  1. range遍历数组,更快
  2. range遍历的时候返回一个索引和对应的值
  3. 不需要索引的时候,用下划线代替
	sum := 0
	for i, num := range nums {
		sum += num
		if num == 2 {
			fmt.Println("index:", i, "。num:", num) //index:0 num:2
		}
	}
	fmt.Println(sum) //9

	//map有对应的value和key值
	m := map[string]string{"a": "A", "b": "B"}
	for k, v := range m {
		fmt.Println(k, v) // b 8; a A
	}
	for k := range m {
		fmt.Println("key", k) // key a; key b
	}

结构体

和c的结构体区别也不大

type 结构体名 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"
	fmt.Println(a, b, c, d)                 //{wang 1024} iwang 1024} {wang 1024} {wang 1024}
	fmt.Println(checkPassword(a, "haha"))   // false
	fmt.Println(checkPassword2(&a, "haha")) // false
}

func checkPassword(u user, password string) bool {
	return u.password == password
}

//同样的结构体我们也能支持指针,这样能够实现对于结构体的修改,也可以在某些情况下避免一些大结构体的拷贝开销。
//指针
func checkPassword2(u *user, password string) bool {
	return u.password == password
}

错误处理

  1. 错误处理在go 语言里面符合语言习惯的做法就是使用一个单独的返回值来传递错误信息。
  2. 不同于Java自家家使用的异常。go语言的处理方式,能够很清晰地知道哪个函数返回了错误,并且能用简单的if else来处理错误。
  3. 在函数 里面容易出错,可以在函数的返回值里加一个error,代表这个函数可能出错
  4. 如果有错误报错返回一个error,有错报错,该返回的值返回nil
  5. 没有错,就返回原本结果

记得在import加"errors"包,

	for _, u := range users {
		if u.name == name {
			return &u, nil
		}
	}
	return nil, errors.New("not found")
}
func main() {
	u, err := findUser([]user{{"wang", "1024"}}, "wang")
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(u.name) //wang

	if u, err := findUser([]user{{"wang", "1024"}}, "li"); err != nil {
		fmt.Println(err) // not found
		return
	} else {
		fmt.Println(u.name)
	}
}