这是我参与「第五届青训营 」笔记创作活动的第6天,整理了第一天上课记录的go语言基础语法的知识点,并加入了一些自己的补充
变量
强类型语言,字符串可以+,可以用等号判断相同
var a = "" //直接声明,省略类型
var b,c int = 1,2 //显示声明变量类型
var e float64
f := float32(e) //变量类型转换
const s string = "const" //常量没有类型?自动确定类型
条件&循环
if
if n%2 == 0 { //不用小括号,大括号写在同一行
switch
不用加break,不会跑其他分支;可以使用任意变量类型;可以写成多个条件分支
switch{
case t.Hour() < 12 :
.....
default:
.....
}
for
Go语言只有for循环这一种循环语句:
for initialization; condition; post {
// zero or more statements
}
- 无限循环:用
break或return语句终止
for {
// ...
}
数组 & 切片
var a [3]int //数组声明,定长
var s []type //切片声明
var s []type = make([]type, len)
s := make([]type,len)
s = append(s,"d")
copy(s1,s2)
s[2:5]
map
map是引用类型,完全无序
var numbers map[string] int //声明
m := make(map[string]int) //string:key, int:val
var rating := map[string] float32 {"C":5, "Go":4.5, "Python":4.5, "C++":2 } //初始化
m["one"] = 1 // 插入、修改值
//查找,r = val,ok= true/false
r,ok = map["key"]
// 删除
delete[m,"key"]
range
用range遍历数组、切片、map
for index,val := range array {
}
for k,v := range map{
}
func
变量类型后置,可以返回多个值
func exists(m map[string]string, k string) (v string, ok bool) {
v, ok = m[k]
return v, ok
}
指针
主要是对指针指向的参数进行修改 *int 指针类型,&取地址,*取指针指向的变量
结构体
type user struct{
name string
password string
}
a := user{name: "wang", password: "1024"}
//传递结构体指针,避免拷贝开销
func setPassword(u *user, password string) {
}
//定义结构体方法,注意:结构体指针也是用.访问结构体变量
func (u *user) setPassword(password string) {
u.password = password
}
Error
error类型是一个内置接口类型,处理错误
func findUser(users []user, name string) (v *user, err error)
errors.New("not found")
func (de *DivideError) Error() string //定义实现error接口的错误类型
panic(err) //终止程序,返回non-zero exit code
string
len() 函数的返回值的类型为 int,表示字符串的 ASCII 字符个数或字节长度
Go 语言的字符串都以 UTF-8 格式保存,每个中文占用 3 个字节
Go语言的字符有以下两种:
- 一种是 uint8 类型,或者叫 byte 型,代表了 ASCII 码的一个字符。
- 另一种是 rune 类型,代表一个 UTF-8 字符,等价于int32
a := "hello"
fmt.Println(strings.Contains(a, "ll")) // true
fmt.Println(strings.Count(a, "l")) // 2
fmt.Println(strings.HasPrefix(a, "he")) // true
fmt.Println(strings.HasSuffix(a, "llo")) // true
fmt.Println(strings.Index(a, "ll")) // 2
fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // he-llo
fmt.Println(strings.Repeat(a, 2)) // hellohello
fmt.Println(strings.Replace(a, "e", "E", -1)) // hEllo
fmt.Println(strings.Split("a-b-c", "-")) // [a b c]
fmt.Println(strings.ToLower(a)) // hello
fmt.Println(strings.ToUpper(a)) // HELLO
fmt.Println(len(a)) // 5
b := "你好"
fmt.Println(len(b)) // 6
字符串格式化:
fmt.Println(s, n) //打印多个变量,再换行
//结构体打印
fmt.Printf("p=%v\n", p) // p={1 2}
fmt.Printf("p=%+v\n", p) // p={x:1 y:2}
fmt.Printf("p=%#v\n", p) // p=main.point{x:1, y:2}
//浮点数
fmt.Printf("%.2f\n", f) // 3.14
Json
type userInfo struct {
Age int `json:"age"`
}
buf, err := json.Marshal(a) //buf是字节序列
string(buf) //转换为字符串
buf, err = json.MarshalIndent(a, "haha", "\t")
var b userInfo
err = json.Unmarshal(buf, &b)
Time
t := time.Date(2022, 3, 27, 1, 25, 36, 0, time.UTC)
t2 := time.Date(2022, 3, 27, 2, 30, 36, 0, time.UTC)
fmt.Println(t) // 2022-03-27 01:25:36 +0000 UTC
fmt.Println(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute()) // 2022 March 27 1 25
fmt.Println(t.Format("2006-01-02 15:04:05")) // 2022-03-27 01:25:36
diff := t2.Sub(t)
fmt.Println(diff) // 1h5m0s
fmt.Println(diff.Minutes(), diff.Seconds()) // 65 3900
t3, err := time.Parse("2006-01-02 15:04:05", "2022-03-27 01:25:36")
if err != nil {
panic(err)
}
fmt.Println(t3 == t) // true
fmt.Println(now.Unix()) // 1648738080
string转数
f, _ := strconv.ParseFloat("1.234", 64)
n, _ := strconv.ParseInt("111", 10, 64)
n, _ = strconv.ParseInt("0x1000", 0, 64) //0自动识别
n2, err := strconv.Atoi("123") //反过来Itoa,格式错误会有error
系统
fmt.Println(os.Args) // [/var/folders/8p/n34xxfnx38dg8bv_x8l62t_m0000gn/T/go-build3406981276/b001/exe/main a b c d]
fmt.Println(os.Getenv("PATH")) // /usr/local/go/bin...
fmt.Println(os.Setenv("AA", "BB"))
buf, err := exec.Command("grep", "127.0.0.1", "/etc/hosts").CombinedOutput()