Go语言基础语法 | 青训营笔记

49 阅读3分钟

这是我参与「第五届青训营 」笔记创作活动的第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
}
  • 无限循环:用breakreturn语句终止
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 *DivideErrorError() 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()