GO语言学习笔记(2)| 青训营笔记

88 阅读2分钟

[ go 与 golang | 青训营笔记]

这是我参与「第五届青训营 」伴学笔记创作活动的第 2天, 在学习了go的相关基础知识以后,可以说是初步的了解了go,我在这过程中也记录了一些自己的学习经验以及心得,与大家分享一下。

6. 运算符

6.1 算术运算符

,+ ,-, *, / ,% 注意:go中没用前++,只有后++

位运算符

var b uint8 = 0b00111100 // 往右移两位 
fmt.Printf("b>>2:%b\n", b>>2) 
// 0b00001111 
// 往左移两位 
fmt.Printf("b<<2:%b\n", b<<2) // 0b111100

& 按位与 全1为1

| 按位或 有1为1

^ 按位异或 相同为0 不同为1

赋值运算符

+=

-=

*=

/=

^=

eg:>>=

<<=

关系运算符

>
>=
<
<=
==
!=

逻辑运算符

&& 与
|| 或
! 非

地址运算符

7. 判断语句

if else

与Java不同的是,go语言在执行判断时不需要加括号,即使加括号也不会报错,但是我们需要一种代码规范风格,所以最好不要加括号

if age := 23; age > 22 {
      fmt.Println("yes")
} else {
fmt.Println("no")
}

需要注意的是,if后面的左大括号,必须和if在同一行

这种语法是不被编译通过的

if else if else

if age := 23; age > 22 {
      fmt.Println("yes")
} else if age > 10 {
       fmt.Println("no")
} else {
fmt.Println("err")
}

switch case


fmt.Println("请输入你的年龄")
var age uint8
fmt.Scanln(&age)
switch {
  case age < 13:
    fmt.Println("年龄小于13")
    fallthrough
  case age < 25:
    fmt.Println("年龄小于25")
  default:
    fmt.Println("年龄大于25")
}

fallthrough是用于case穿透

break是退出当前switch,默认每个case后都有break

和if else 区别:

  1. if else是多个条件选一个,只要成立了一个,后面的就都不会去匹配了

  2. switch的每一个case是从上到下去匹配,如果没有break,则每一个都会去匹配

8. for循环

无限循环


i := 1
for {
  fmt.Println(i)
  i++
  if i == 10 {
    break
  }
}

条件循环

i := 1
for i <= 10 {
  fmt.Println(i)
  i++
}

标准for循环

for i := 1; i <= 10; i++ {
  fmt.Println(i)
}

go语言没有while循环,并且for循环不可以加括号,会报编译错误

break

跳出当前循环

continue

结束本次循环

流程控制

  1. 要求用户从命令行输入用户名,密码,确认密码
  2. 如果输入不为空且两次密码相同,则打印注册成功并结束程序,否则根据情况提示用户输入不能为空或两次密码不一致,并且要求用户重新输入
package main

import (
  "fmt"
)

//1. 要求用户从命令行输入用户名,密码,确认密码
//2. 如果输入不为空且两次密码相同,则打印注册成功并结束程序,否则根据情况提示用户输入不能为空或两次密码不一致,并且要求用户重新输入

func main() {

  var (
    username   string
    password   string
    rePassword string
  )

  for {
    fmt.Println("请输入用户名:")
    fmt.Scanln(&username)
    fmt.Println("请输入密码:")
    fmt.Scanln(&password)
    fmt.Println("请再次输入密码:")
    fmt.Scanln(&rePassword)

    if !(username != "" && password != "" && rePassword != "") {
      fmt.Println("请不要输入空值!\b\n请重新输入")
      continue
    }
    //if username == "" || password == "" || rePassword == "" {
    //  fmt.Println("请不要输入空值!\b\n请重新输入")
    //  continue
    //}
    if password != rePassword {
      fmt.Println("请确保两次密码一致!")
      continue
    }

    fmt.Println("注册成功!")
    //os.Exit(0)

    break
  }

}

9. 函数

标准函数写法

func GetSum(n1 int, n2 int) int{
    sum := n1 + n2
    return sum
}

func main(){
    res := GetSum(1, 2)
    fmt.Println(res)
}

实参:给函数实际传递的参数,例如上面的1,2

形参:形式上的参数,例如上面的n1和n2

支持函数多返回值

func getRes(n1 int, n2 int) (int, int) {
  sum := n1 + n2
  difference := n1 - n2
  return sum, difference
}
func getRes(n1 int, n2 int) (sum, difference int) {
  sum := n1 + n2
  difference := n1 - n2
  return
}

两个及以上的返回值,上面类型要加括号

函数也是数据类型

函数不是变量,但他也存在与内存中,存在内存地址

函数名的本质就是一个指向其函数内存地址的指针常量

func getRes(n1, n2 int) (sum, difference int) {
  sum = n1 + n2
  difference = n1 - n2
  return
}

func main() {
  fmt.Printf("getRes is %v, type is %T", getRes, getRes)
  //getRes is 0x4aca00, type is func(int, int) (int, int)
}

匿名函数

var getRes = func(n1, n2 int) (sum, difference int) {
  sum = n1 + n2
  difference = n1 - n2
  return
}
a, b := getRes(1, 2)
fmt.Println(a, b)

c,d := func(n1, n2 int) (sum, difference int) {
  sum = n1 + n2
  difference = n1 - n2
  return
}(2,3)
fmt.Println(c,d)

10. 指针

值传递,引用传递

go中是值传递,如果用切片是引用传递

func add(n int) { 
n++ 
fmt.Println("add函数结束时:", n) 
} 
func main() { 
var y = 2022 
add(y) 
fmt.Println("调用add函数之后:", y) 
}

可以看到函数调用结束之后,y的值还是2022

这就是说明函数传递默认是值传递

我们可以使用&可以获取某个变量的内存地址

用*获取到内存地址所对应的值

func add(n *int) { 
*n++ 
fmt.Println("add函数结束时:", n, *n) 
} 
func main() { 
var y = 2022 
var yy = &y 
add(yy) 
fmt.Println("调用add函数之后:", y, &y) 
}