4、数据结构

数据结构01

数值处理

取整

日常用的四种

  • / 整数除法,截取整数部分

  • math.Ceil 向上取整 "理解为天花板,向上取值"

  • math.Floor 向下取整 "理解为地板,向下取值"

  • math.Round 四舍五入

    / 整数除法,截取整数部分
    func main() {
    fmt.Println(1/2, 5/2, 3/2) //0 2 1
    fmt.Println(-1/2, -5/2, -3/2) // 0 -2 -1
    }

    math.Ceil 向上取整 "理解为天花板,向上取值"
    func main() {
    fmt.Println(math.Ceil(2.01), math.Ceil(2.5), math.Ceil(2.8)) // 3 3 3
    fmt.Println(math.Ceil(-2.01), math.Ceil(-2.5), math.Ceil(-2.8)) // -2 -2 2
    }

    math.Floor 向下取整 "理解为地板,向下取值"
    func main() {
    fmt.Println(math.Floor(2.01), math.Floor(2.5), math.Floor(2.8)) // 2 2 2
    fmt.Println(math.Floor(-2.01), math.Floor(-2.5), math.Floor(-2.8))// -3 -3 -3
    }

    math.Round 四舍五入
    func main() {
    fmt.Println(math.Round(2.01), math.Round(2.5), math.Round(2.8))
    fmt.Println(math.Round(-2.01), math.Round(-2.5), math.Round(-2.8))
    fmt.Println(math.Round(0.5), math.Round(1.5), math.Round(2.5),
    math.Round(3.5))
    }
    2 3 3
    -2 -3 -3
    1 2 3 4

常用数值处理

复制代码
fmt.Println(math.Abs(-2.7)) // 绝对值
fmt.Println(math.E, math.Pi) // 常数
fmt.Println(math.MaxInt16, math.MinInt16) // 常量,极值
fmt.Println(math.Log10(100), math.Log2(8)) // 对数
fmt.Println(math.Max(1, 2), math.Min(-2, 3)) // 最大值、最小值
fmt.Println(math.Pow(2, 3), math.Pow10(3)) // 幂
fmt.Println(math.Mod(5, 2), 5%2) // 取模
fmt.Println(math.Sqrt(2), math.Sqrt(3), math.Pow(2, 0.5)) // 开方

标准输入Scan

Scan:空白字符分割,回车提交。换行符当做空白字符

前人经验,一定要有空格分隔,不要用什么花里胡哨的符合来当做分隔符,因为有时候%s string类型是把那些符号作为字符串的,当做一个整体

复制代码
package main

import "fmt"

func main() {
	var n int
	var err error
	var (
		name string
		age  int
	)
	n, err = fmt.Scan(&name, &age)
	if err != nil {
		panic(err)
	}
	fmt.Println(n, name, age)
}

面板输入zfl 20

输出2 zfl 20

如果少一个数据,Scan就会阻塞;如果输入数据多了,等下回Scan读取。例如,一次性输入zfl 20 100 只读取前面两个

如果使用短格式已经声明了n err 则再次使用n, err,不用声明

复制代码
func main() {
	var (
		name  string
		age   int
		heigh int
		wget  int
	)
	n, err := fmt.Scan(&name, &age)      
	if err != nil {
		panic(err)
	}
	fmt.Println(n, name, age)
	n, err = fmt.Scan(&heigh, &wget)    //前面短格式已经声明了,不需要在此声明
	if err != nil {
		panic(err)
	}
	fmt.Println(n, name, age, heigh, wget)
}
面板输入zfl 20

输出2 zfl 20 继续输入
100 174
输出  2 zfl 20 100 174      后面的2 是第二次声明的n

如果使用,分隔
func main() {
	var (
		name  string
		age   int
		heigh int
		wget  int
	)
	n, err := fmt.Scan(&name, &age)      
	if err != nil {
		panic(err)
	}
	fmt.Println(n, name, age)
面板输入zfl,20,100,170
20
输出2 zfl,20,100,170 20   因为name为string类型所以,分隔的看做为一个整体的字符串

在面板输入的任何都是string类型,通过Scan类型转换为声明的类型,想要的类型

Scanf:读取输入,按照格式匹配解析。如果解析失败,立即报错,那么就会影响后面的Scanf。

这个和Printf是一样的 只不过这个是按照类型输入

复制代码
package main

import "fmt"

func main() {
	var n int
	var err error
	var name string
	var age int
	fmt.Print("Plz input your name and age: ")
	n, err = fmt.Scanf("%s %d\n", &name, &age) // 这里要有\n以匹配回车

	if err != nil {
		panic(err)
	}
	fmt.Println(n, name, age)
}

控制面板必须按照对应的类型输入不然的话会直接报错的 

fmt.Scanf("%s,%d", &name, &age) 中%s会和后面的非空白字符分不清楚,用 abc,20 是匹配不上
的,因为除空白字符外,都可以看做是字符串。所以,建议格式字符串中,一律使用空格等空白字符分割。

相关推荐
利威尔xu18 分钟前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang
FungLeo1 小时前
成为全栈·Go 后端篇·从 Node SQLite 到 PostgreSQL:把迁移做成独立交付物
postgresql·golang·sqlite·go·数据库迁移·成为全栈
夜不会漫长2 小时前
C++:红黑树
数据结构·算法
冻柠檬飞冰走茶4 小时前
PTA刷题集之Airline Routes(C语言实现)
c语言·开发语言·数据结构·算法
736c5 小时前
固件开发岗算法
数据结构·算法
冻柠檬飞冰走茶5 小时前
PTA刷题集之Battle Over Cities - Hard Version(C语言实现)
c语言·开发语言·数据结构·算法
皓月盈江6 小时前
GO使用Gin框架实现模板定义、解析与渲染
linux·golang·go·gin·定义模板·解析模板·渲染模板
利威尔xu7 小时前
万字详解|Go 进阶(五):sync 包底层:Mutex 自旋 4 次转饥饿,WaitGroup 漏 1 个 Done 挂起 3000 goroutine
后端·golang·并发编程·源码分析·sync
日日大王学编程8 小时前
AI 时代后端方向新人的未来规划与看法
人工智能·后端·python·ai·golang
FungLeo9 小时前
成为全栈·Go 后端篇·Go 后端怎么测试:从成功响应到故障后置状态
golang·集成测试·差分测试·成为全栈·后端测试·数据库测试