二、基础语法分析(下)
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
字段的use
r结构体,并在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
函数打印出这些用户变量的值。接下来,调用checkPasswor
d函数并输出结果。最后,调用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语法的格式以及小数位数的控制等。
今天的分享就到这里啦,期待下一次分享。我很爱这个世界……