Привет всем, меня зовут Мин.
В период самостоятельного изучения Golang я написал подробные учебные заметки и разместил их в своем личном общедоступном аккаунте WeChat «Время программирования на Go».Что касается языка Go, я тоже новичок, поэтому то, что я написал, должно больше подходить для новых студентов, если вы только изучаете язык Go, вам стоит обратить на него внимание, учиться и расти вместе.
Мой онлайн-блог:golang.iswbm.comМой Github: github.com/iswbm/GolangCodingTime
1. О функциях
Функции — это повторно используемые структуры кода, инкапсулированные на основе функциональности или логики. Инкапсуляция длинного фрагмента кода со сложными функциями в несколько фрагментов кода (то есть функций) помогает улучшить читабельность и удобство сопровождения кода.
В языке Go функции можно разделить на два типа:
- Обычные функции с именами
- анонимная функция без имени
Поскольку Go является компилируемым языком, порядок, в котором записываются функции, не имеет значения, в отличие от Python, где функции должны быть определены в позиции перед вызовом.
2. Отчет о функции
Объявление функции с использованием ключевого слова func, за которым следует函数名
,参数列表
,返回值列表
,用 {} 包裹的代码逻辑体
func 函数名(形式参数列表)(返回值列表){
函数体
}
-
Формальный список параметров описывает имена и типы параметров функции, которые используются как локальные переменные, значения которых предоставляются вызывающим параметром.
-
Список возвращаемых значений описывает имя переменной и тип возвращаемого функцией значения.Если функция возвращает безымянную переменную или не возвращает никакого значения, круглые скобки в списке возвращаемых значений можно опустить.
Например, определите функцию суммы, которая получает два параметра типа int, и присваивает свои значения a и b во время работы, и оговаривает, что должно быть возвращено значение типа int.
func sum(a int, b int) (int){
return a + b
}
func main() {
fmt.Println(sum(1,2))
}
3. Функции реализуют переменные параметры
В приведенном выше примере количество параметров фиксировано, что несложно понять.Укажите, какой тип параметра передать в какой тип переменной.По количеству не может быть больше или меньше. (как будто необязательных параметров нет).
В Python мы можем использоватьаргументы и *kw также реализует вариативные функции.
Существует несколько типов переменных параметров:
- Несколько параметров одного типа
- Несколько параметров с несовместимыми типами
Несколько параметров одного типа
Первый — это несколько параметров одного типа.
Здесь мы определяем функцию, которая может суммировать несколько значений,
использовать...int
, представляющий срез, элемент которого имеет тип int, который используется для получения параметров, переданных вызывающей стороной.
// 使用 ...类型,表示一个元素为int类型的切片
func sum(args ...int) int {
var sum int
for _, v := range args {
sum += v
}
return sum
}
func main() {
fmt.Println(sum(1, 2, 3))
}
// output: 6
в...
Это синтаксический сахар, реализованный языком Go для облегчения написания кода программистами.Если в функции есть несколько типов функций, этот синтаксический сахар должен быть последним параметром.
В то же время этот синтаксический сахар можно использовать только при определении функций.
Несколько параметров с несовместимыми типами
В приведенном выше примере все наши типы параметров - int. Если вы хотите передать несколько параметров, и типы этих параметров разные, вы можете указать тип как...interface{}
, а затем снова пройтись.
Например, следующий код является прототипом функции fmt.Printf() в стандартной библиотеке языка Go:
import "fmt"
func MyPrintf(args ...interface{}) {
for _, arg := range args {
switch arg.(type) {
case int:
fmt.Println(arg, "is an int value.")
case string:
fmt.Println(arg, "is a string value.")
case int64:
fmt.Println(arg, "is an int64 value.")
default:
fmt.Println(arg, "is an unknown type.")
}
}
}
func main() {
var v1 int = 1
var v2 int64 = 234
var v3 string = "hello"
var v4 float32 = 1.234
MyPrintf(v1, v2, v3, v4)
}
В некоторых случаях нам нужно определить функцию с переменным числом параметров, и конкретное количество передаваемых параметров зависит от вызывающей стороны, но независимо от того, сколько параметров передано, функция может с этим справиться.
Например, здесь реализовано накопление
func myfunc(args ...int) {
for _, arg := range args {
fmt.Println(arg)
}
}
4. Несколько функций с переменным числом переменных, передающих параметры
упомянутое выше, которое можно использовать...
Кроме того, для получения нескольких параметров также используется использование, которое используется для неупорядочения, извлечения переменных параметров (среза) функции один за другим и передачи их другой функции переменных параметров вместо передачи вариативного сама переменная.
Такое же использование можно использовать только при передаче параметров функциям.
Примеры следующие:
import "fmt"
func sum(args ...int) int {
var result int
for _, v := range args {
result += v
}
return result
}
func Sum(args ...int) int {
// 利用 ... 来解序列
result := sum(args...)
return result
}
func main() {
fmt.Println(sum(1, 2, 3))
}
5. Возвращаемое значение функции
Язык функций Go, в вашем определении, предоставляет эту функцию
-
Есть ли возвращаемое значение?
Когда тип возвращаемого значения не указан, тело функции не может иметь возврата, Go не имеет возврата, как Python, и по умолчанию возвращает None.
-
Сколько значений возвращается?
Go поддерживает функцию, возвращающую несколько значений.
func double(a int) (int, int) { b := a * 2 return a, b } func main() { // 接收参数用逗号分隔 a, b := double(2) fmt.Println(a, b) }
-
Как вернуть значение?
Go поддерживает возвращаемые значения с именами переменных
func double(a int) (b int) { // 不能使用 := ,因为在返回值哪里已经声明了为int b = a * 2 // 不需要指明写回哪个变量,在返回值类型那里已经指定了 return } func main() { fmt.Println(double(2)) } // output: 4
6. Методы и функции
способ, описанный в предыдущем разделе »08. Объектно-ориентированное программирование: структуры и наследование", его определение несколько отличается от функции, вы можете нажать на предыдущий заголовок для перекрестного обучения.
ЭтоВ чем разница между методом и функцией?На случай, если будут друзья, впервые соприкасающиеся с объектно-ориентированным, вот вам слово.
Метод — это особый вид функции. Когда вы привязываете функцию к объекту/структуре, мы называем функцию методом.
7. Использование анонимных функций
Так называемая анонимная функция — это функция без имени, она имеет только тело логики функции, но не имеет имени функции.
Формат определения следующий
func(参数列表)(返回参数列表){
函数体
}
Имя на самом деле не имеет большого значения. Все анонимные функции можно заменить обычными именованными функциями. Итак, при каких обстоятельствах можно использовать анонимную функцию?
Определить имена переменных несложно, но отнимает много ума.Для функций, которые используются только один раз, нет необходимости иметь имена. Вот откуда берутся анонимные функции.
На этом фоне установлено, что анонимные функции имеют короткий срок службы и обычно используются сразу после определения.
Именно так он выполняется сразу после определения (это всего лишь пример, реальный код не имеет значения).
func(data int) {
fmt.Println("hello", data)
}(100)
Или использовать как функцию обратного вызова
// 第二个参数为函数
func visit(list []int, f func(int)) {
for _, v := range list {
// 执行回调函数
f(v)
}
}
func main() {
// 使用匿名函数直接做为参数
visit([]int{1, 2, 3, 4}, func(v int) {
fmt.Println(v)
})
}
Руководство по серии
01. Построение среды разработки (Goland & VS Code)
02. Изучите пять методов создания переменных
03. Подробные типы данных:**Целое число и число с плавающей запятой**
04. Подробные типы данных: байт, руна строки
05. Подробно объясните типы данных: массивы и срезы
06. Подробно объясните типы данных: словари и логические значения
07. Подробно объясните типы данных: указатели
08. Объектно-ориентированное программирование: структуры и наследование
09. Статья для понимания функций в Go
10. Гуделиться управление потоком языка: если-els условное утверждение
11. Упражнение языкового процесса: оператор выбора коммутатора
12. Управление потоком языка Go: оператор цикла for
13. Перейти к управлению языковым потоком: перейти к безусловному переходу
14. Перейти к управлению языковым потоком: отложить отложенный вызов
15. Объектно-ориентированное программирование: интерфейсы и полиморфизм
16. Ключевые слова: В чем разница между make и new?
17. Статья о понимании блоков и области видимости в Go
18. Изучите Go Coroutines: горутины
19. Изучите сопрограммы Go: подробно объясните каналы/каналы
20. Подробное объяснение нескольких классических случаев зависания канала.
21. Изучите сопрограммы Go: группа ожидания
22. Изучите процедуры Go: мьютексы и блокировки чтения-записи
23. Обработка исключений в Go: паника и восстановление
24. Сверхдетальная интерпретация прошлой жизни Go Modules и вводное использование
25. 8 важных знаний об импорте пакетов на языке Go
26. Как открыть исходный код модулей, которые я написал для использования другими?
27. Расскажите об утверждениях типов в Go?
28. Эти пять пунктов помогут вам понять, как использовать select в языке Go.