这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
1.编译和运行
1.1 HelloWorld
package main
import (
"fmt"
)
func main() {
fmt.Println("hello world")
}
fmt包用于screen上输出输入字符串,格式化字符串。
1.2 编译方式
1.直接运行go run helloworld.go。
2.编译运行go build helloworld.go,然后运行./helloworld。
2. 基础语法
2.1 变量声明
func main() {
//方法一:指定变量类型
var i int
//方法二:根据值自行判定变量类型
var num = 100
//方法三:省略var,=是赋值, :=是声明变量并赋值。注意 :=左侧变量不应该是已经声明过的,否则会编译错误
name := "helloworld"
}
const没有确定的类型,根据上下文自动确定类型。
2.2 if else, for, switch
if 7%2 == 0 {
}
else {
}
for i := 0; i < 5; i++{
}
switch a {
case 1:
case 2:
default:
}
与其他语言区别:
- if语句判断条件没有( ),无法像c++那样写成一行(后面必须加{ });
- 循环语句只有for;
- switch语句不需要break, 如果满足多个条件,中间用逗号分隔,有其中一个匹配成功即可。case可以是条件表达式。
2.3 数组和切片
var a [5]int
b := [5]int{1,2,3,4,5}
数组长度固定,与其他语言没有差别。
s := make([]string, 3)
切片类似于动态数组。可以使用s = append(s, "d")追加元素, 注意结果需赋值原数组。s[2:5]取元素类似于python, 但不支持负索引。
2.4 map & range
m := make(map[string]int)
m['one'] = 1
这里key is string, value is int
for i, num range nums{ }
range可以用来遍历数组, 返回两个值, 索引和对应的值。不需要索引可以用下划线_忽略。
2.5 func
func add(a int, b int) int{ }
变量类型后置很烦。
2.6 指针
func add2ptr(n *int){ *n += 2 }
类似c和c++,主要用途是对传入参数进行修改,其实就是需要用指针对变量进行操作,而直接使用则操作的是局部变量。
2.7 结构体
type user struct{
name string
password string
}
初始化:
a := user{name: "wang", password: "1023"}\
结构体方法:
func (u user ) checkPassword(password string) bool{
return u.password == password
}
or(u *user), 区别是是否对对结构体对象本身修改。
2.7 错误处理
go可以在函数出错的情况下,返回错误信息。通常, 正常输出返回值有两个, 一个是返回值, 另一个是error。如果出错了,可以return nil 和 error信息。
2.8 字符串处理
判断一个字符串是否包含有另一个字符串
fmt.Println(strings.Contains(hello, "ll")) // true
fmt.Println(strings.Count(hello, "l")) // 2
fmt.Println(strings.HasPrefix(hello, "he")) // true
fmt.Println(strings.HasSuffix(hello, "llo")) // true
fmt.Println(strings.Index(hello, "ll")) // 2
fmt.Println(strings.Join([]string{"he", "llo"}, "-")) // he-llo
fmt.Println(strings.Repeat(hello, 2)) //hellohello
fmt.Println(strings.Replace(hello, "e", "E", -1)) // hEllo
fmt.Println(strings.Split("a-b-c", "-")) // [a b c]
fmt.Println(strings.ToLower(hello)) // hello
fmt.Println(strings.ToUpper(hello)) // HELLO
fmt.Println(len(hello)) // 5
strings.Contains 字符串s中是否包含substr返回bool值;
strings.Join 字符串链接;
strings.Index 在字符串s中查找sep所在的位置,返回位置值,找不到返回-1;
strings.Repeat 在s字符串中,把old字符串替换为new字符串,n表示替换的次数,小于0表示全部替换;
strings.Split 把s字符串按照sep分割,返回slice
2.9 字符串格式化
使用%v打印任意类型变量, %+v打印详细结果, %#v更详细
2.10 JSON处理
type userInfo struct {
Name string
Age int `json:"age"`
Hobby []string
}
结构体转JSON串:
buf, err := json.Marshal(a) a是结构体实例化对象
JSON串反序列化到结构体变量:
err = json.Unmarshal(buf, &b)
2.11 数字字符串转换
包 strconv(string convert)
字符串转数字:
f, _ = strconv.ParseFloat("1.234", 64)
数字转字符串:
e, err := strconv.Atoi("1023")
3. 命令行获取
os.Argv 获取命令行参数
os.Getenv("PATH") 获取环境变量
os.Setenv("AA", "BB") 设定环境变量