Go基础练习题 附讲解

简介: Go基础练习题 附讲解

一:数据类型篇

%d 十进制 %T 输出数据类型 %b将整数转化为整数型

%o 八进制 %x十六进制 %v使用默认格式输出值


1.编写代码统计出字符串 "hello沙河小王子"中汉字的数量。

package main
import "fmt"
func main() {
   target := "hello沙河小王子"
   count := 0
   for _, value := range target {
      if len(string(value)) >= 3 {
         count++
      }
   }
   fmt.Println(count)
}

注解:在go中,中文字符不能直接通过len函数来统计字符串字符长度,以为是以UTF-8格式进行存储,字符串上调用len函数,取得的是字符串包含字节个数,中文字符算三个字节,所以通过判断字符的长度来进行判断


二:运算符篇

2.有一堆数字,如果除了一个数字以外,其他数字都出现了两次,那么如何找到出现一次的数字?

package main
import "fmt"
func main() {
   var b = [...]int{1, 1, 2, 2, 4, 5, 5, 6, 6}
   //var c = [3]int{1, 1, 2}
   //var d = [3]int{1: 2, 2: 3, 0: 4}
   count := 0
   for _, value := range b {
      count ^= value
   }
   fmt.Println(count)
}

注解:^二进制两个不同才为1


三:数组和流程控制篇

3.编写代码打印9*9乘法表

package main
import "fmt"
func main() {
   for i := 1; i < 10; i++ {
      for j := 1; j <= i; j++ {
         fmt.Printf("%v*%v\t", j, i)
      }
      fmt.Println()
   }
}


4.对输出结果进行分析

package main
import "fmt"
func main() {
   var a = make([]string, 5, 10)
   for i := 0; i < 10; i++ {
      a = append(a, fmt.Sprintf("%v", i))
   }
   fmt.Println(a)
   //[     0 1 2 3 4 5 6 7 8 9]
}

注解:因为切片初始长度为5且为空,使用append添加元素后,容量不够可以扩容,所以输出后前面会存在一些空格


四:Map篇

5.写一个程序,统计一个字符串中每个单词出现的次数。比如:”how do you do”中how=1 do=2 you=1。

package main
import (
   "fmt"
   "strings"
)
func main() {
   test := "how do you do"
   result := count(test)
   for index, value := range result {
      fmt.Printf("the world:%v \t appeared:%v \n", value, index)
   }
}
func count(test string) map[string]int {
   test1 := strings.Split(test, " ")
   mapDemo := make(map[string]int, 10)
   for _, v := range test1 {
      mapDemo[v]++
   }
   return mapDemo
}
//the world:1      appeared:how 
//the world:1      appeared:you 
//the world:2      appeared:do


注解:根据map主键的增加,找出每个单词频率

6.对结果进行分析(大坑)

func main() {
type Map map[string][]int
m := make(Map)
s := []int{1, 2}
s = append(s, 3)
fmt.Printf("%+v\n", s)
m["q1mi"] = s
s = append(s[:1], s[2:]...)
fmt.Printf("%+v\n", s)
fmt.Printf("%+v\n", m["q1mi"])
}
//[1 2 3]
[1 3]  
[1 3 3]


注解:根据切片定义,切片本质是一个底层数组包括指针,容量,长度,s和m[“qimi”],它们是共享一个底层数组的,但是长度和容量是各顾各的,后面s修改了长度和索引为1的值,m[“qimi”]长度不受限制,但是值改变了

7.分金币

package main
import (
   "fmt"
)
/*
你有50枚金币,需要分配给以下几个人:Matthew,Sarah,Augustus,Heidi,Emilie,Peter,Giana,Adriano,Aaron,Elizabeth。
分配规则如下:
a. 名字中每包含1个'e'或'E'分1枚金币
b. 名字中每包含1个'i'或'I'分2枚金币
c. 名字中每包含1个'o'或'O'分3枚金币
d: 名字中每包含1个'u'或'U'分4枚金币
写一个程序,计算每个用户分到多少金币,以及最后剩余多少金币?
程序结构如下,请实现 ‘dispatchCoin’ 函数
*/
func dispatchCoin() (left int) {
   var (
      coins = 50
      user  = []string{
         "Matthew", "Sarah", "Augustus", "Heidi", "Emilie", "Peter", "Giana", "Adriano", "Aaron", "Elizabeth",
      }
      distribution = make(map[string]int, len(user))
   )
   for _, name := range user {
      getCoin := 0
      for _, n := range name {
         switch n {
         case 'e', 'E':
            getCoin += 1
         case 'i', 'I':
            getCoin += 2
         case 'o', 'O':
            getCoin += 3
         case 'u', 'U':
            getCoin += 4
         }
      }
      distribution[name] = getCoin
      coins -= getCoin
   }
   fmt.Printf("%v\n", distribution)
   return coins
}
func main() {
   left := dispatchCoin()
   fmt.Println("剩下:", left)
}

注解:题中所给依旧是一个map,通过两层for循环,将字符分别统计,最后输出


五:结构体篇

8.使用“面向对象”的思维方式编写一个学生信息管理系统。
学生有id、姓名、年龄、分数等信息
程序提供展示学生列表、添加学生、编辑学生信息、删除学生等功能

package main
import (
   "fmt"
   "os"
)
type student struct {
   id   int
   name string
}
//创造一个map来接收学生信息
var studentList = make(map[int]*student)
//新添加学生的信息
func newstudent(id int, name string) *student {
   return &student{
      id,
      name,
   }
}
//修改
func (e *student) editStudent(name string) {
   e.name = name
}
// 列出学生信息列表
func listStudent() {
   if len(studentList) == 0 {
      fmt.Println("学生列表为空")
   } else {
      for i, v := range studentList {
         fmt.Printf("学号:%d 姓名:%s\n", i, v.name)
      }
   }
}
// 增加学生信息
func addStudent() {
   var key int
   var name string
   fmt.Printf("请输入学生学号:")
   //这个函数将会返回个数
   fmt.Scanln(&key)
   _, ok := studentList[key]
   have := ok
   for have {
      fmt.Println("学号已经存在")
      fmt.Printf("请输入学生学号:")
      fmt.Scanln(&key)
      _, ok := studentList[key]
      have = ok
   }
   fmt.Printf("请输入学生姓名:")
   fmt.Scanln(&name)
   newstudent := newstudent(key, name)
   studentList[key] = newstudent
}
func editStudent() {
   var key int
   fmt.Printf("请输入需要修改信息学生的学号:")
   fmt.Scanln(&key)
   _, ok := studentList[key]
   if ok {
      var name string
      fmt.Printf("请输入需要修改学生学号:")
      fmt.Scanln(&name)
      studentList[key].editStudent(name)
      fmt.Printf("修改成功\n")
      listStudent()
   } else {
      fmt.Println("学号不存在")
   }
}
func deleteStudent() {
   var key int
   fmt.Printf("请输入需要删除学生的学号:")
   fmt.Scanln(&key)
   _, ok := studentList[key]
   if ok {
      delete(studentList, key)
      listStudent()
      fmt.Println("删除成功")
   } else {
      fmt.Println("学号不存在")
   }
}
func main() {
   fmt.Println("欢迎进入学生管理系统")
   //无限循环
   for {
      fmt.Println(`
         1.展示学生列表
         2.添加学生
         3.编辑学生信息
         4.删除学生
         5.退出
         `)
      fmt.Printf("请选择你的操作:")
      var input int
      //函数扫描标准输入中给定的输入文本
      //它返回成功扫描的项目数
      fmt.Scanln(&input)
      //fmt.Printf("你选择的操作是:%d\n、", input)
      switch input {
      case 1:
         listStudent()
      case 2:
         addStudent()
      case 3:
         editStudent()
      case 4:
         deleteStudent()
      case 5:
         os.Exit(1)
      default:
         fmt.Println("请按照规则输入")
      }
   }
}


六:基础包篇

补充:同一个项目下只能有一个mod文件,不同的mod是在不同的项目下,同一个mod下的文件可以相互引用

9.编写一个calc包实现加减乘除四个功能函数,在snow这个包中引入calc包并调用其加减乘除四个函数实现数学运算。

package main
import (
   "fmt"
   "os"
   "strconv"
   "weishuaibo.com/xxx/test/calc"
)
func main() {
   for {
      var a, b, c string
      var result float64
      fmt.Printf("请输入表达式:")
      fmt.Scanln(&a, &b, &c)
      //ParseFloat是一个内置的函数,
      //可以将一个字符串值转换为一个浮点数
      aa, _ := strconv.ParseFloat(a, 64)
      cc, _ := strconv.ParseFloat(c, 64)
      if b == "+" {
         result = calc.Sum(aa, cc)
      } else if b == "-" {
         result = calc.Sub(aa, cc)
      } else if b == "*" {
         result = calc.Mul(aa, cc)
      } else if b == "/" {
         result = calc.Div(aa, cc)
      } else {
         os.Exit(0)
      }
      fmt.Printf("%v \n", result)
   }
}


运算符包:

package calc
func Sum(a float64, b float64) float64 {
   return (a + b)
}
func Sub(a float64, b float64) float64 {
   return (a - b)
}
func Mul(a float64, b float64) float64 {
   return (a * b)
}
func Div(a float64, b float64) float64 {
   return (a / b)
}


相关文章
|
Go C语言
GO基础知识分享2
GO基础知识分享2
|
存储 Java Go
Go基础学习【1】
Go基础学习【1】
|
JSON Go 数据格式
go基础语法50问,来看看你的go基础合格了吗?1
1.使用值为 nil 的 slice、map会发生啥 2.访问 map 中的 key,需要注意啥 3.string 类型的值可以修改吗 4.switch 中如何强制执行下一个 case 代码块 5.你是如何关闭 HTTP 的响应体的 6.你是否主动关闭过http连接,为啥要这样做 7.解析 JSON 数据时,默认将数值当做哪种类型 8.如何从 panic 中恢复 9.简短声明的变量需要注意啥 10.range 迭代 map是有序的吗 11.recover的执行时机 12.闭包错误引用同一个变量问题怎么处理 13.在循环内部执行defer语句会发生啥 14.说出一个避免Goroutine泄露的措
90 0
|
存储 JSON Java
go基础语法50问,来看看你的go基础合格了吗?2
go基础语法50问,来看看你的go基础合格了吗?2
67 0
|
存储 Go 调度
Go基础学习【3】
Go基础学习【3】
|
编译器 Go
go变量声明等学习# 【我的go学习第二课】
go变量声明等学习# 【我的go学习第二课】
81 0
|
Java Go
第一章 go基础语法
1. go定义变量的几种方式 2. go内建变量类型 3. 常量的定义 4. go枚举 5. go的if语句
126 0
第一章 go基础语法