Go 语言入门指南:基础语法和常用特性解析(中)| 青训营

二、基础语法分析(下)

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程序。这个程序定义了一个包含namepassword字段的user结构体,并在main函数中使用了这个结构体和相关的函数。下面是每一部分的解释:

type user struct {  
  name     string  
  password string  
}

这段代码定义了一个名为user的结构体,它有两个字段namepassword,分别表示用户的名称和密码。

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、cd。分别使用不同的方式进行初始化。然后,使用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  
}

这段代码定义了两个函数checkPasswordcheckPassword2,用于检查给定的用户结构体的密码。checkPassword函数接收一个user类型的参数,而checkPassword2函数接收一个指向user类型的指针作为参数。这两个函数都会比较用户的密码与给定的密码是否匹配,并返回比较结果。

总的来说,这个程序演示了如何定义和使用结构体、如何初始化结构体变量、以及如何传递结构体和指针参数给函数进行操作。

12.结构体方法


这是一个使用方法的Go程序。这个程序包含了user结构体,并定义了两个方法checkPasswordresetPassword来操作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函数中创建了一个名为auser实例,并使用初始化指定的用户名和密码。然后,使用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函数将sn打印出来。由于它们是不同类型的变量,所以它们会以空格分隔打印出来。

然后,我们使用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语法的格式以及小数位数的控制等。

今天的分享就到这里啦,期待下一次分享。我很爱这个世界……

© 版权声明
THE END
喜欢就支持一下吧
点赞0

Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MYMjqcHG' (Errcode: 28 - No space left on device) in /www/wwwroot/583.cn/wp-includes/class-wpdb.php on line 2345
admin的头像-五八三
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

图形验证码
取消
昵称代码图片