go语言的复习
数据类型
- go中没有专用用来存放字节的数据类型,一般是用byte来存储,而byte 是uint8的别名,而字符串是由一串固定长度的字符组成的字符序列,传统的字符串是字符组成的,而go的字符串是由字节组成的。也就是说如果单独打印字符串的每个字符时,是以字符的形式来输出的。
- 一般来说存字符是byte 来存储,但是byte =>uint 当是中文字符时需要占用3个字符,此时就需要使用int 来存储字符,而格式话输出需要使用 fmt.Printf("%c")的形式来输出。
- go中字符的本质就是一个整数,如果直接输出,则输出的是UTF-8编码值,因此也可以直接给一个变量赋值一个整数,然后用字符来显示其对应的字符。因此字符类型是可以运算的
数据类型的转换
其他类型转字符串
func Sprintf(format string, a ...interface{}) string
func Sprint(a ...interface{}) string
两个函数都能转换其他类型为字符串类型,而且都支持同时转换多个,转换之前的字符串如果是非字符串类型,则Sprint()的转换会在 两者之间加上空格,而Sprinf()不会他会按format格式来原样来输出。
同时也说明他是支持多个字符转换并合并的。
s1 := fmt.Sprintf("%d%t", 10, true)
第二种其他格式转为字符串类型的使用,
注意strconv.Itoa() 只能转换为int类型的。
var s1 bool
var s2 int64
var s3 float64
s1, _ = strconv.ParseBool("true")
s2, _ = strconv.ParseInt("10", 10, 8) //bitSize指定结果必须能无溢出赋值的整数类型
s3, _ = strconv.ParseFloat("3.4", 16) //但是接受的变量必须是int64 ,否则就会报错。
fmt.Printf("s1 = %t\ns2 = %d\ns3 = %f", s1, s2, s3)
指针
- 值类型都有对应的指针类型 格式如 *int *float64 等,常见的值类型 基本数据类型 + 数组 +struct结构体 。
- 引用类型有 指针 、slice 切片、 map 、管道chan 、interface
- 值类型通常是在栈种分配,而引用类型通常是在堆中分配
运算
- 取模的本质运算 a%b = a - a/b*b
- 交换两个变量的值,不使用第三个变量的算法
- go 中不支持二进制来直接表示,但是可以使用 %b 来显示为二进制。010 第一个是数字零 表示为8进制的10 也就是8 ,0x10 第一个数字零 0x 和 0X都可以用来表示16进制。
标准化输入
- fmt.Scanf 和fmt.Scanfln 的区别就是默认 Scanf 是按照format格式进行输入,对byte类型必须使用他,每个输入的字符和format 的格式是完全一一对应的
- scanln 则是将换行符做为一次输入的结束。scan 则是将换行视为空格,将空格作为分隔符。
循环
- if 循环的常见用法 ,if 后面接的条件只要是一个bool 值就可以。
-
if age := 20; age > 100 { //此种方式申明的变量是局部变量只能在if循环中使用 // 只能是 := 的方式来申明变量,其他都是错的 fmt.Println(age) }
var a, b int32 fmt.Println(">>>") fmt.Scanf("%d %d", &a, &b) if a+b > 50 && a+b < 100 { //if 条件表达式 fmt.Println("hello world") } else { fmt.Println("< 50") }
-
if xxxx { 代码 1 } else if { 代码 2 } else //else 是可以有,也可以没有的{ 代码块 }
var a bool = true if !a { fmt.Println("ok1") } else if a { fmt.Println("ok2") } else { fmt.Println("ok3") }
-
switch 语句,先执行switch 表达式求出其值,根据其值去匹配 case 表达式的值,如果是一致则 执行case 后面的语句。如果都不匹配就执行default 的语句。
-
case 后面的表达式可以有多个,使用逗号来分隔,只要匹配到一个就算成功匹配。
var a byte
fmt.Println("a-b : ")
fmt.Scanf("%c ", &a)
switch a {
case 'a':
fmt.Println("a")
case 'b':
fmt.Println("b")
default:
fmt.Println("other")
}
- switch 后面的表达式可以是 变量 ,常量, 还可以是函数的返回值。
- switch 表达式的值的数据类型必须和case表达式的数据类型完全一致。
- switch 不带表达式就类似if else语句,也可以想象成 不带语句就是判断是否为true ,如果true 则执行
-
switch { case b > 11: fmt.Println("a") case true: fmt.Println("b") default: fmt.Println("other") } }
- switch 中还有个关键字 fallthough ,用于传统该层语句到下一层,但是一个fallthough 只能穿透一层。
- switch 的两种特殊用法,switch 赋值语句;switch 定义赋值接口类型语句;
switch 变量定义赋值语句; 不推荐但是语法没有错误
switch b := 10; {
case b > 11:
fmt.Println("a")
fallthrough
case true:
fmt.Println("b")
default:
fmt.Println("other")
var a int = 10
var b interface{}
b = a
switch b.(type) {
case int32:
fmt.Println("int32")
case string:
fmt.Println("string")
case int:
fmt.Println("int")
default:
fmt.Println("no match")
}
switch 和if 语句的使用场景对比,1 如果是对数据的类型进行判断使用 switch 更简洁,2 如果是选择区间比较少时选择if
for 循环 的三种方式
for i := 1; i < 2; i++ { //标准的for 循环
fmt.Println("kind one ")
}
k := 1
j := 1
for j < 2 { //只有判断部分的for 循环
fmt.Println("kind two")
j++
}
for { //死循环
if k < 2 {
fmt.Println("kind three ")
k++
} else {
break
}
for 循环的特殊用法 for range 来输出字符类型和字节类型
var a string = "echo 中 国"
for i, j := range a {
fmt.Printf("i = %d j = %c\n", i, j)
}
fmt.Println("--------")
for i := 0; i < len(a); i++ {
fmt.Printf("i = %d j = %c\n", i, a[i])
随机数函数的引入 math/rand 和seed
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().Unix()) //引入随机数的种子
for i := 0; i < 9; i++ {
fmt.Println(rand.Intn(9)) //此时的n是前包后不包也就是[0-9)
}
- break 语句用于 for 循环中还能用于switch语句中用于中止循环
- break lable 来中止指定的label,而非最近的循环 ,此时的label名字可以自定义,紧紧能中止label下的语句的循环,其他非循环语句是不行的
- continue 也支持label的方式,而goto的使用也需要结合label .只是goto 对应的label:下面接的是语句,而break continue 接的是循环。