【Go语言刷题篇】Go完结篇|函数、结构体、接口、错误入门学习

简介: - 本期是学习Golang的完结篇:函数、结构体、接口、错误入门学习,有不懂的地方可以评论进行讨论!

前言


- 本期是学习Golang的完结篇:函数、结构体、接口、错误入门学习,有不懂的地方可以评论进行讨论!


接下来我将继续更新Python刷题系列、数据库从0到入门刷题系列等等。

本系列文章采用牛客的核心代码模式进行案例代码提供,帮助大家从0到入门的学习过程中进行配套的刷题~

推荐给大家一款刷题、面试的神器,我也是用这一款神器进行学习的!~链接如下:刷题神器跳转链接

该神器不仅网页界面十分美观,而且操作起来极易上手入门!非常适合新手进行系统性的学习!

小白新手可以通过该神器进行日常的刷题、看大厂面经、学习计算机基础知识、与大牛面对面沟通~ 刷题的图片已经放在下面了~

Q1:函数-数字的阶乘


问题描述:一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。


相关知识:

1、递归,就是在运行的过程中调用自己。 一个函数调用自己,就叫做递归函数。构成递归需具备的条件:子问题须与原始问题为同样的事,且更为简单。不能无限制地调用本身,须有个出口,化简为非递归状况处理。


实例输入:2

实例输出:2


案例代码:

//import "fmt"
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * @param i int整型 数字
 * @return int整型
*/
func factorial( i int ) int {
  // write code here
  if i == 0{
    return 1
  }
  return i * factorial(i-1)
}

Q2:函数-绝对值


问题描述:定义一个函数,函数的功能是给出一个数,返回该数的绝对值。


相关知识:

1、函数的定义: 函数声明包含一个函数名,参数列表, 返回值列表和函数体。如果函数没有返回值,则返回列表可以省略。函数从第一条语句开始执行,直到执行return语句或者执行函数的最后一条语句。函数可以没有参数或接受多个参数。注意类型在变量名之后 。当两个或多个连续的函数命名参数是同一类型,则除了最后一个类型之外,其他都可以省略。函数可以返回任意数量的返回值。使用关键字 func 定义函数,左大括号依旧不能另起一行。

func function_name( [parameter list] ) [return_types] {
   函数体
}

2、函数的调用:当创建函数时,你定义了函数需要做什么,通过调用该函数来执行指定任务。调用函数,向函数传递参数,并返回值

3、Go 函数可以返回多个值,"_"标识符,用来忽略函数的某个返回值Go 的返回值可以被命名,并且就像在函数体开头声明的变量那样使用。返回值的名称应当具有一定的意义,可以作为文档使用。没有参数的 return 语句返回各个返回变量的当前值。


实例输入:-1

实例输出:1


案例代码:

案例代码:

//import "fmt"
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * @param x int整型 
 * @return int整型
*/
func absfunc(x int) int {
  // write code here
  if x < 0 {
  return -x
  }
  return x
}


Q3:函数-加减乘除


问题描述:定义一个函数,实现输入a,b两个数,返回两数的和,差,乘积,商,余数。然后依次存入切片中,最后返回。


相关知识:

1、Go中函数支持多个返回值,但函数有多个返回值时,如果其中某个或某几个返回值不想使用,可以通过下划线_来丢弃这些返回值。例如下面的f1函数两个返回值,调用该函数时,丢弃了第二个返回值b,只保留了第一个返回值a赋值给了变量a。


实例输入:2,2

实例输出:[4,0,4,1,0]


案例代码:

//import "fmt"
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * @param a int整型 
 * @param b int整型 
 * @return int整型一维数组
*/
func operate( a int ,  b int ) []int {
  // write code here
  var ans []int
  ans = append(ans, a+b)
  ans = append(ans, a-b)
  ans = append(ans, a*b)
  ans = append(ans, a/b)
    ans = append(ans, a % b)
  return ans
}


Q4:结构体-学生信息1


问题描述:每个学生都有如下信息:姓名name,性别sex,年龄age,分数score,定义一个结构体Student,来表示小明的信息,小明的信息如下:姓名:小明,性别:true,年龄:23,分数:88


相关知识:

1、Go语言中的基础数据类型可以表示一些事物的基本属性,但是当我们想表达一个事物的全部或部分属性时,这时候再用单一的基本数据类型明显就无法满足需求了,Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称struct。 也就是我们可以通过struct来定义自己的类型了。

2、结构体由一系列命名的元素组成,这些元素又被称为字段,每个字段都有一个名称和一个类型。

3、结构体的目的就是把数据聚集在一起,以便能够更加便捷地操作这些数据。

4、结构体的定义:结构体定义需要使用 type 和 struct 语句。struct 语句定义一个新的数据类型,结构体中有一个或多个成员。type 语句设定了结构体的名称。结构体的格式如下:

type 类型名 struct {

字段名 字段类型

字段名 字段类型

}

类型名:标识自定义结构体的名称,在同一个包内不能重复。

字段名:表示结构体字段名。结构体中的字段名必须唯一。

字段类型:表示结构体字段的具体类型。

5、访问结构体的成员:如果要访问结构体成员,需要使用点号 . 操作符。


示例输入:无

示例输出:

小明
true
23
88


案例代码:

import "fmt"
type stu struct {
  name  string
  sex   bool
  age   int
  score int
}
func main() {
  a := stu{
  name:  "小明",
  age:   23,
  sex:   true,
  score: 88,
  }
  fmt.Println(a.name)
  fmt.Println(a.sex)
  fmt.Println(a.age)
  fmt.Println(a.score)
}


Q5:结构体-学生信息2


问题描述:每个学生都有如下信息:姓名name,性别sex,年龄age,分数score,地址信息address,其中address地址信息又包含城市city,省份province等信息, 定义一个结构体Student,来表示小明的信息,小明的信息如下:姓名:小明,性别:true,年龄:23,分数:88,province:湖南省,city:长沙市。

依次输出打印小明信息


相关知识:

1、一个结构体中可以嵌套包含另一个结构体或结构体指针。


示例输入:

示例输出:

小明
true
23
88
湖南省
长沙市


案例代码:

import (
  "fmt"
)
type address struct {
  city     string
  prov***ring
}
type stu struct {
  name  string
  sex   bool
  age   int
  score int
  add   address
}
func main() {
  a := stu{
  name:  "小明",
  age:   23,
  sex:   true,
  score: 88,
  add: address{
    city:     "长沙市",
    province: "湖南省",
  },
  }
  fmt.Println(a.name)
  fmt.Println(a.sex)
  fmt.Println(a.age)
  fmt.Println(a.score)
  fmt.Println(a.add.province)
  fmt.Println(a.add.city)
}


Q6:接口-动物和老虎


问题描述:定义一个动物接口,该接口有 sleep,eat 方法,定义老虎实现动物接口,老虎的sleep方法输出"tiger sleep",eat方法输出"tiger eat",最后依次调用老虎的sleep,eat方法。


相关知识:

1、 在Go语言中接口(interface)是一种类型,一种抽象的类型。interface是一组method的集合,是duck-type programming的一种体现。接口做的事情就像是定义一个协议(规则), 只要一台机器有洗衣服和甩干的功能,我就称它为洗衣机。不关心属性(数据),只关心行为(方法)。

2、接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节。面向接口编程

3、接口是一个或多个方法签名的集合。

4、任何类型的方法集中只要拥有该接口’对应的全部方法’签名。就表示它 “实现” 了该接口,无须在该类型上显式声明实现了哪个接口。这称为Structural Typing。所谓对应方法,是指有相同名称、参数列表 (不包括参数名) 以及返回值。当然,该类型还可以有其他方法。

5、接口只有方法声明,没有实现,没有数据字段。接口可以匿名嵌入其他接口,或嵌入到结构中。

6、type 接口类型名 interface{

方法名1( 参数列表1 ) 返回值列表1

方法名2( 参数列表2 ) 返回值列表2

}


示例输入:无

示例输出:

sleep
eat


案例代码:

import "fmt"
type animal interface {
  sleep()
  eat()
}
type tiger struct {
}
func (t tiger) sleep() {
  fmt.Println("sleep")
}
func (t tiger) eat() {
  fmt.Println("eat")
}
func main() {
  var t animal = tiger{}
  t.sleep()
  t.eat()
}


Q7:错误-网络延迟


问题描述:实现erro接口,自定义一个错误,该错误抛出"网络延迟"错误。输入网络的延迟数,如果延迟数大于100则认为网络延迟,并返回


相关知识:

1、 错误:Go 语言通过内置的错误接口提供了非常简单的错误处理机制。


type error interface {
        Error() string
        }


2、实现 error 接口类型来生成错误信息,函数通常在最后的返回值中返回错误信息。使用errors.New 可返回一个错误信息


示例输入:150

示例输出:“网络延迟”


案例代码:

import "errors"
type error interface {
  Error() string
}
func Error() string {
  return "网络延迟"
}
func defineerr(ping int) string {
  // write code here
  if ping > 100 {
  errors.New("网络延迟")
  return "网络延迟"
  }
  return ""
}


Q8:错误-体温异常


问题描述:实现一个函数,该函数的功能是 给定一个float类型变量表示某个人的体温,如果有人体温大于37.5,抛出"体温异常",并输出。


相关知识:

1、Go中可以抛出一个panic的异常,然后在defer中通过recover捕获这个异常,然后正常处理。


示例输入:38.000000

示例输出:“体温异常”


案例代码:

//import "fmt"
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * @param t double浮点型 体温
 * @return string字符串
*/
func temperature(t float64) (ans string) {
  // write code here
  ans = ""
  defer func() {
  err := recover()
  if err != nil {
    ans = "体温异常"
  }
  }()
  if t > 37.5 {
  panic("体温异常  弹出警告!")
  }
  return ans
}


后文:刷题神器


点击链接进行跳转注册,开始你的保姆级刷题之路吧!刷题打怪码神之路


另外这里不仅仅可以刷题,你想要的这里都会有,十分适合小白和初学者入门学习~

1、算法篇(398题):面试必刷100题、算法入门、面试高频榜单

2、数据结构篇(300题):都是非常经典的链表、树、堆、栈、队列、动态规划等

3、语言篇(500题):C/C++、java、python入门算法练习

4、SQL篇(82题):快速入门、SQL必知必会、SQL进阶挑战、面试真题

5、大厂笔试真题:字节跳动、美团、百度、腾讯…掌握经验不在惧怕面试!


相关文章
|
安全 Java 编译器
对比Java学习Go——基础理论篇
本章介绍了Java开发者学习Go语言的必要性。Go语言以简单、高效、并发为核心设计哲学,摒弃了传统的类继承和异常机制,采用组合、接口和多返回值错误处理,提升了代码清晰度与开发效率。Go直接编译为静态二进制文件,启动迅速、部署简便,其基于Goroutine和Channel的并发模型相较Java的线程与锁机制更轻量安全。此外,Go Modules简化了依赖管理,与Java的Maven/Gradle形成鲜明对比,提升了构建与部署效率。
742 1
|
11月前
|
Java 编译器 Go
【Golang】(5)Go基础的进阶知识!带你认识迭代器与类型以及声明并使用接口与泛型!
好烦好烦好烦!你是否还在为弄不懂Go中的泛型和接口而烦恼?是否还在苦恼思考迭代器的运行方式和意义?本篇文章将带你了解Go的接口与泛型,还有迭代器的使用,附送类型断言的解释
454 3
|
11月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
489 2
|
12月前
|
存储 Java Go
对比Java学习Go——函数、集合和OOP
Go语言的函数支持声明与调用,具备多返回值、命名返回值等特性,结合`func`关键字与类型后置语法,使函数定义简洁直观。函数可作为一等公民传递、赋值或作为参数,支持匿名函数与闭包。Go通过组合与接口实现面向对象编程,结构体定义数据,方法定义行为,接口实现多态,体现了Go语言的简洁与高效设计。
348 4
|
存储 Java 编译器
对比Java学习Go——程序结构与变量
本节对比了Java与Go语言的基础结构,包括“Hello, World!”程序、代码组织方式、入口函数定义、基本数据类型及变量声明方式。Java强调严格的面向对象结构,所有代码需置于类中,入口方法需严格符合`public static void main(String[] args)`格式;而Go语言结构更简洁,使用包和函数组织代码,入口函数为`func main()`。两种语言在变量声明、常量定义、类型系统等方面也存在显著差异,体现了各自的设计哲学。
405 0
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
698 0
|
Shell Go API
Go语言grequests库并发请求的实战案例
Go语言grequests库并发请求的实战案例
|
存储 缓存 安全
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
|
存储 负载均衡 监控
如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
在数字化时代,构建高可靠性服务架构至关重要。本文探讨了如何利用Go语言的高效性、并发支持、简洁性和跨平台性等优势,通过合理设计架构、实现负载均衡、构建容错机制、建立监控体系、优化数据存储及实施服务治理等步骤,打造稳定可靠的服务架构。
613 1
|
Go 调度 开发者
探索Go语言中的并发模式:goroutine与channel
在本文中,我们将深入探讨Go语言中的核心并发特性——goroutine和channel。不同于传统的并发模型,Go语言的并发机制以其简洁性和高效性著称。本文将通过实际代码示例,展示如何利用goroutine实现轻量级的并发执行,以及如何通过channel安全地在goroutine之间传递数据。摘要部分将概述这些概念,并提示读者本文将提供哪些具体的技术洞见。

热门文章

最新文章