Map(集合)
Map 是一种无序的键值对的集合。Map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值。
Map 是一种集合,所以我们可以像迭代数组和切片那样迭代它。不过,Map 是无序的,我们无法决定它的返回顺序,这是因为 Map 是使用 hash 表来实现的。
声明变量,默认 map 是 nil
var hash map[int]int
使用 make 函数
hash:=make(map[int]int)
实例:
country:=make(map[string]string) country["China"] = "中国" country["Japan"] = "日本" fmt.Println(country) //map[China:中国 Japan:日本]
delete
country:=make(map[string]string) country["China"] = "中国" country["Japan"] = "日本" delete(country,"Japan") fmt.Println(country) //map[China:中国
递归函数
递归,就是在运行的过程中调用自己。
实例1:阶乘
var i int =5 fmt.Println(factorial(i)) //120 func factorial(n int)int{ if n>0{ return n*factorial(n-1) } return 1 }
实例2:生成斐波那契数列
var i int = 5 fmt.Println(fibonacci(i)) //5 func fibonacci(n int)int{ if n<2{ return n } return fibonacci(n-1)+fibonacci(n-2) } var user Users user = new(User) user.call() user = new(Vip) user.call() type Users interface { call() } type User struct { } type Vip struct { } func (vip,Vip) call() { fmt.Println("Vip User") } func (user User) call() { fmt.Println("User") }
错误处理
Go 语言通过内置的错误接口提供了非常简单的错误处理机制。
result, err:= Sqrt(-1) if err != nil { fmt.Println(err) }
定义报错接口
type error interface { Error() string } func Sqrt(f float64) (float64, error) { if f < 0 { return 0, errors.New("不能为负数") } return error }
GOlang练习题
1.四个数进行排列组合。
有 1、2、3、4 这四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
func threeTotal()int{ ret:=0 for i:=1;i<5;i++{ for k:=1;k<5;k++{ for j:=1;j<5;j++{ if i!=k && k!=j && j!=i{ ret++ fmt.Println("组成的组合有i=",i,",k=",k,",j=",j) } } } } return ret } threeTotal() //24 // 组成的组合有i= 1 ,k= 2 ,j= 3 // 组成的组合有i= 1 ,k= 2 ,j= 4 // 组成的组合有i= 1 ,k= 3 ,j= 2 // 组成的组合有i= 1 ,k= 3 ,j= 4 // 组成的组合有i= 1 ,k= 4 ,j= 2 // 组成的组合有i= 1 ,k= 4 ,j= 3 // 组成的组合有i= 2 ,k= 1 ,j= 3 // 组成的组合有i= 2 ,k= 1 ,j= 4 // 组成的组合有i= 2 ,k= 3 ,j= 1 // 组成的组合有i= 2 ,k= 3 ,j= 4 // 组成的组合有i= 2 ,k= 4 ,j= 1 // 组成的组合有i= 2 ,k= 4 ,j= 3 // 组成的组合有i= 3 ,k= 1 ,j= 2 // 组成的组合有i= 3 ,k= 1 ,j= 4 // 组成的组合有i= 3 ,k= 2 ,j= 1 // 组成的组合有i= 3 ,k= 2 ,j= 4 // 组成的组合有i= 3 ,k= 4 ,j= 1 // 组成的组合有i= 3 ,k= 4 ,j= 2 // 组成的组合有i= 4 ,k= 1 ,j= 2 // 组成的组合有i= 4 ,k= 1 ,j= 3 // 组成的组合有i= 4 ,k= 2 ,j= 1 // 组成的组合有i= 4 ,k= 2 ,j= 3 // 组成的组合有i= 4 ,k= 3 ,j= 1 // 组成的组合有i= 4 ,k= 3 ,j= 2
2.企业发放的奖金根据利润提成的计算
企业发放的奖金根据利润提成。利润(I)低于或等于 10 万元时,奖金可提成 10%;利润高于 10 万元,低于 20 万元,低于 10 万元的部分按 10% 提成,高于 10 万元的部分,可提成 7.5%。20 万到 40 万之间时,高于 20 万元的部分,可提成 5%;40 万到 60 万之间时高于 40 万元的部分,可提成 3%;60 万到 100 万之间时,高于 60 万元的部分,可提成 1.5%,高于 100 万元时,超过 100 万元的部分按 1% 提成。从键盘输入当月利润 I,求应发放奖金总数?
func fundSum()float32 { var I float32 = 0.0 var bonus float32 = 0.0 fmt.Print("输入利润:") fmt.Scanf("%f\n", &I) switch{ case I > 1000000: bonus = (I - 1000000) * 0.01 I = 1000000 fallthrough case I > 600000: bonus += (I - 600000) * 0.015 I = 600000 fallthrough case I > 400000: bonus += (I - 400000) * 0.03 I = 400000 fallthrough case I > 200000: bonus += (I - 200000) * 0.05 I = 200000 fallthrough case I > 100000: bonus += (I - 100000) * 0.075 I = 100000 fallthrough default: bonus += I * 0.1 } fmt.Printf("奖金总额为%f\n",bonus) return bonus } fundSum() //输入利润:888222 //奖金总额为37823.328125
3.计算完全平方数
一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少?
func perfectSqure()int{ i:=0 for { x :=int(math.Sqrt(float64(i+100))) y :=int(math.Sqrt(float64(i+100+168))) if x*x ==(i+100) && y*y == (i+100+168){ fmt.Printf("该数是%d\n",i) return i } i++ } } fmt.Println(perfectSqure()) //该数是21
4.数字从小到大排序
输入三个 整数 x,y,z,请把这三个数由小到大输出。
func threeCompare(){ var a,b,c int=0,0,0 fmt.Scanf("%d%d%d",&a,&b,&c) if a>b { a,b = b,a } if a>c{ a,c = c,a } if b>c{ b,c = c,b } fmt.Printf("%d<%d<%d",a,b,c) } threeCompare() //2123 23232 123 //123<2123<23232
5.打印字母 C。
func printC(){ var a, b = 176, 219 fmt.Printf("%c%c%c%c%c%c%c%c \n", a, a, b, b, b, a, a,a) fmt.Printf("%c%c%c%c%c%c%c%c \n", a, b, a, a, a, b, a,a) fmt.Printf("%c%c%c%c%c%c%c%c \n", a, b, a, a, a, a, a,a) fmt.Printf("%c%c%c%c%c%c%c%c \n", a, b, a, a, a, a, a,a) fmt.Printf("%c%c%c%c%c%c%c%c \n", a, a, b, a, a, b, a,a) fmt.Printf("%c%c%c%c%c%c%c%c \n", a, a, a, b, b, a, a,a) } printC()
6.找出数组中的幸运数
在整数数组中,如果一个整数的出现频次和它的数值大小相等,我们就称这个整数为「幸运数」。给你一个整数数组 arr,请你从中找出并返回一个幸运数。
package main import "fmt" func main() { nums := []int{1,2,3,4} ret:=find132pattern(nums) fmt.Println(ret) } func findLucky(arr []int) int { //定义哈希变量 hash:=make(map[int]int) for _,j:=range arr{ //记录元素出现的次数 hash[j]++ } ret:=-1 for i,j:=range hash{ //找到最大次数和值相等的情况 if i==j && ret<i{ ret=i } } return ret }