[ 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 区别:
-
if else是多个条件选一个,只要成立了一个,后面的就都不会去匹配了
-
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
结束本次循环
流程控制
- 要求用户从命令行输入用户名,密码,确认密码
- 如果输入不为空且两次密码相同,则打印注册成功并结束程序,否则根据情况提示用户输入不能为空或两次密码不一致,并且要求用户重新输入
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)
}