1.Go语言的特性
2.Go语言的安装
先去官网安装好Go的开发环境,然后在VsCode中安装Go的插件,就可以使用了。
3.Go的语法
变量与常量
声明变量的两种方式:
- var name=value
- name :=value
声明常量:
- const name=value(根据上下文自动确定类型)
字符串是内置类型,可以通过加号去拼接。
package main
import (
"fmt"
"math"
)
func main() {
var a = "initial"
var b, c int = 1, 2
var d = true
var e float64
f := float32(e)
g := a + "foo"
fmt.Println(a, b, c, d, e, f) // initial 1 2 true 0 0
fmt.Println(g) // initialfoo
const s string = "constant"
const h = 500000000
const i = 3e20 / h
fmt.Println(s, h, i, math.Sin(h), math.Sin(i))
}
if-else
if-else中的条件不用括号
if num := 9; num < 0 {
fmt.Println(num, "is negative")
} else if num < 10 {
fmt.Println(num, "has 1 digit")
} else {
fmt.Println(num, "has multiple digits")
}
循环
只有for循环,没有while这些,就算只有一句话也需要加上花括号。
for {
fmt.Println("loop")
break
}
for j := 7; j < 9; j++ {
fmt.Println(j)
}
switch
switch下的case不需要break,若switch后面为空直接跟花括号,则case后面不限定条件的类型。
t := time.Now()
switch {
case t.Hour() < 12-8:
fmt.Println("It's before noon")
default:
fmt.Println("It's after noon")
}
a := 2
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")
}
数组
数字长度是固定的
var a [5]int
a[4] = 100
fmt.Println(a[2]) // 0
fmt.Println(len(a)) // 5
fmt.Println(a[4]) // 100
切片
可以是任意长度的数组,可以去更改长度 ,使用append时记得再赋值给原数组。
func main() {
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")
fmt.Println(s) // [a b c d e f]
fmt.Println("len:", len(s)) // 6
c := make([]string, len(s))
copy(c, s)
fmt.Println(c) // [a b c d e f]
fmt.Println(s[2:5]) // [c d e]
fmt.Println(s[:5]) // [a b c d e]
fmt.Println(s[2:]) // [c d e f]
good := []string{"g", "o", "o", "d"}
fmt.Println(good) // [g o o d]
}
map
用make去创建,delete删除。在map中去读取时,在后面加,ok,可以去找该key在map中是否存在 返回value值和布尔值。
func main() {
m := make(map[string]int)
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
s, ok := m["two"]
fmt.Println(s, ok) // 2 true
delete(m, "one")
m2 := map[string]int{"one": 1, "two": 2}
var m3 = map[string]int{"one": 1, "two": 2}
fmt.Println(m2, m3)
}
range
nums := []int{2, 3, 4}
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
m := map[string]string{"a": "A", "b": "B"}
for k, v := range m {
fmt.Println(k, v) // b B; a A
}
for k := range m {
fmt.Println("key", k) // key a; key b
}
函数
函数的变量类型是后置的
func add(a int, b int) int {
return a + b
}
func add2(a, 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
}
指针
和C++有点像,形参是指针类型*,同时实参记得加 &,在函数里面进行运算时也要记得带*
package main
import "fmt"
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
}
结构体
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")) // true
fmt.Println(checkPassword2(&a, "1024")) // true
结构体方法
有两种,一种带指针,一种不带指针。带指针的会改变结构体本身
type user struct {
name string
password string
}
func (u user) checkPassword(password string) bool {
return u.password == password
}
func (u *user) resetPassword(password string) {
u.password = password
}
func main() {
a := user{name: "wang", password: "1024"}
a.resetPassword("2048")
fmt.Println(a.checkPassword("2048")) // true
}
看完第一课的心得,Go语言被很多大厂使用,据说有一定其它语言基础上手会很快,感觉特性跟Java有一点点相像,跨平台、垃圾回收机制,使用和C或C++很类似。入门要记得也很多,任重而道远呐,继续努力!