二、基础语法分析(中)
10.指针
这是一个使用指针的Go语言程序。下面是对程序进行逐行的解释:
func add2(n int) {
n += 2
}
这段代码定义了一个名为 add2 的函数,接受一个整型参数 n。在函数内部,将参数 n 的值加上 2,但由于参数是按值传递的,所以对参数的修改不会影响到函数外部的变量。
func add2ptr(n *int) {
*n += 2
}
这段代码定义了一个名为 add2ptr 的函数,接受一个整型指针参数 n。在函数内部,通过解引用指针 *n,将指针指向的变量的值加上2。由于参数是指针类型,所以对指针指向的变量的修改会影响到函数外部的变量。
func main() {
n := 5
add2(n)
fmt.Println(n)
add2ptr(&n)
fmt.Println(n)
}
这段代码在main函数中定义了一个整型变量 n,并初始化为5。首先调用 add2(n) 函数,将变量 n 的值作为参数传递给函数,但由于参数是按值传递的,所以函数内部对参数的修改不会影响到变量 n 的值,所以打印语句输出的结果仍然是5。接着调用 add2ptr(&n) 函数,将变量 n 的地址作为指针参数传递给函数,函数内部通过解引用指针修改了变量 n 的值,所以打印语句输出的结果是7。
总的来说,这个程序演示了如何定义和使用函数,以及如何使用指针参数对函数外部的变量进行修改。
11.结构体
这是一个使用用户结构体的Go程序。这个程序定义了一个包含name和password字段的user结构体,并在main函数中使用了这个结构体和相关的函数。下面是每一部分的解释:
type user struct {
name string
password string
}
这段代码定义了一个名为user的结构体,它有两个字段name和password,分别表示用户的名称和密码。
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)
fmt.Println(checkPassword(a, "haha"))
fmt.Println(checkPassword2(&a, "haha"))
}
这段代码在main函数中使用user结构体创建了四个用户变量:a、b、c和d。分别使用不同的方式进行初始化。然后,使用fmt.Println函数打印出这些用户变量的值。接下来,调用checkPassword函数并输出结果。最后,调用checkPassword2函数,并输出结果。
func checkPassword(u user, password string) bool {
return u.password == password
}
func checkPassword2(u *user, password string) bool {
return u.password == password
}
这段代码定义了两个函数checkPassword和checkPassword2,用于检查给定的用户结构体的密码。checkPassword函数接收一个user类型的参数,而checkPassword2函数接收一个指向user类型的指针作为参数。这两个函数都会比较用户的密码与给定的密码是否匹配,并返回比较结果。
总的来说,这个程序演示了如何定义和使用结构体、如何初始化结构体变量、以及如何传递结构体和指针参数给函数进行操作。
12.结构体方法
这是一个使用方法的Go程序。这个程序包含了user结构体,并定义了两个方法checkPassword和resetPassword来操作user实例的密码属性。下面是每一部分的解释:
func (u user) checkPassword(password string) bool {
return u.password == password
}
这段代码定义了一个名为checkPassword的方法,它接收一个user类型的接收器u和一个string类型的密码参数。它比较接收器u的密码属性与给定的密码是否匹配,并返回比较结果。
func (u *user) resetPassword(password string) {
u.password = password
}
这段代码定义了一个名为resetPassword的方法,它接收一个指向user类型的指针接收器u和一个string类型的密码参数。它将接收器u的密码属性重置为给定的密码。
func main() {
a := user{name: "wang", password: "1024"}
a.resetPassword("2048")
fmt.Println(a.checkPassword("2048"))
}
这段代码在main函数中创建了一个名为a的user实例,并使用初始化指定的用户名和密码。然后,使用a.resetPassword方法将密码重置为2048。最后,使用a.checkPassword方法检查a的密码是否与给定的密码2048匹配,并打印出结果。
总的来说,这个程序演示了如何在Go中定义和使用方法。方法是与特定类型关联的函数,可以在实例上直接调用,并操作和访问实例的属性。
13.错误处理
func findUser(users []user, name string) (v *user, err error) {
for _, u := range users {
if u.name == name {
return &u, nil
}
}
return nil, errors.New("not found")
}
这个函数名为 findUser,接受一个users切片和一个name字符串作为参数。函数会遍历 users 切片,如果找到匹配的用户,则返回指向该用户的指针,否则返回一个not found的错误。
func main() {
u, err := findUser([]user{{"wang", "1024"}}, "wang")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(u.name)
if u, err := findUser([]user{{"wang", "1024"}}, "li"); err != nil {
fmt.Println(err)
return
} else {
fmt.Println(u.name)
}
}
在main函数中,首先调用 findUser 函数来查找名为 "wang" 的用户。如果找到了用户,将其赋值给变量 u,并打印出用户的名称。如果在调用 findUser 函数时发生错误,打印出错误信息并返回。
接下来,再次调用findUser函数来查找名为 "li" 的用户。如果找到了用户,将其赋值给变量 u,并打印出用户的名称。如果在调用 findUser 函数时发生错误,打印出错误信息并返回。
整体来说,这段代码的目的是通过调用 findUser 函数来查找用户,并打印出用户的名称。如果在查找过程中发生错误,会打印出错误信息。
14.字符串操作
首先,我们定义了一个字符串变量 a 并赋值为 "hello"。
接下来,我们使用 strings.Contains 函数来检查字符串a是否包含子字符串 "ll",并将结果打印出来。
然后,我们使用 strings.Count 函数来计算字符串 a 中子字符串 "l" 的出现次数,并将结果打印出来。
接着,我们使用 strings.HasPrefix 函数来检查字符串 a 是否以子字符串 "he" 开头,并将结果打印出来。
然后,我们使用 strings.HasSuffix 函数来检查字符串 a 是否以子字符串 "llo" 结尾,并将结果打印出来。
接下来,我们使用 strings.Index 函数来查找字符串 a 中子字符串 "ll" 的第一次出现的索引,并将结果打印出来。
然后,我们使用 strings.Join 函数来将字符串切片 {"he", "llo"} 中的元素用 "-" 连接起来,并将结果打印出来。
接着,我们使用 strings.Repeat 函数来将字符串 a 重复两次,并将结果打印出来。
然后,我们使用 strings.Replace 函数来将字符串 a 中的子字符串 "e" 替换为 "E",并将结果打印出来。
接下来,我们使用 strings.Split 函数来将字符串 "a-b-c" 按照 "-" 分割为字符串切片,并将结果打印出来。
然后,我们使用 strings.ToLower 函数将字符串 a 转换为小写,并将结果打印出来。
接着,我们使用 strings.ToUpper 函数将字符串a转换为大写,并将结果打印出来。
然后,我们使用 len 函数来计算字符串 a 的长度,并将结果打印出来。
最后,我们定义了一个字符串变量 b 并赋值为 "你好",然后使用 len 函数来计算字符串 b 的长度,并将结果打印出来。
这段代码主要用于演示 strings 包中的一些常用函数的用法,以及字符串长度的计算。
15.字符串格式化
首先,我们定义了一个字符串变量s并赋值为"hello",一个整数变量n并赋值为123,还有一个名为p的结构体类型的变量并赋值为point{1,2}。
接下来,我们使用fmt.Println函数将s和n打印出来。由于它们是不同类型的变量,所以它们会以空格分隔打印出来。
然后,我们使用fmt.Println函数将结构体变量p打印出来。Go语言会自动打印出结构体的字段名和对应的值。
接着,我们使用fmt.Printf函数来格式化输出字符串s、整数n和结构体p的值。
-
"s=%v\n"表示按照默认格式打印字符串s的值。 -
"n=%v\n"表示按照默认格式打印整数n的值。 -
"p=%v\n"表示按照默认格式打印结构体p的值。 -
"p=%+v\n"表示打印结构体p的值,同时带有字段名。 -
"p=%#v\n"表示打印结构体p的值,同时带有Go语言的语法表示。
接下来,我们定义了一个浮点数变量f并赋值为3.121592653。
然后,我们使用fmt.Println函数将浮点数f打印出来。
接着,我们使用fmt.Printf函数对浮点数f进行格式化输出。
"%.2f\n"表示按照保留两位小数的格式打印浮点数f的值。
这段代码主要演示了Go语言中fmt包提供的格式化输出函数的用法,包括默认格式、带有字段名的格式、带有Go语法的格式以及小数位数的控制等。
今天的分享就到这里啦,期待下一次分享。我很爱这个世界......