Является ли основная функция Goroutine? - PullRequest
0 голосов
/ 20 ноября 2018

Является ли функция main() процедурой?Например, я видел трассировку стека сбоев, как показано ниже, которая заставляет меня спрашивать:

goroutine 1 [running]: main.binarySearch(0x0, 0x61, 0x43,
0xc420043e70, 0x19, 0x19, 0x10)
     /home/---/go/src/github.com/----/sumnum.go:22 +0x80 main.main()
     /home/---/go/src/github.com/---/sumnum.go:13 +0xc1 exit status 2

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Является ли основная функция обычной?

Основная функция - это функция.

Напротив,

A goroutine - это легкая нить исполнения.( source ).

Таким образом, функции выполняют функции, но функции не являются функциями, и между программами и функциями нет отношения 1: 1.

Однако ...

Функция main() выполняется в первой (и только при запуске) программе, goroutine #1.

Но как только эта функция вызывает другую функцию, тогда основная программа больше не выполняет основную функцию, а вместо этого выполняет какую-то другую функцию.

Итак, ясно, что программа и функция - это совершенно разные сущности.

Не связывайте функции с функциями !!

Функции и процедуры - это совершенно разные понятия.И если думать о них как об одном и том же, это приведет к множеству путаницы и проблем.

0 голосов
/ 20 ноября 2018

Да, основная функция запускается в goroutine (основная).

Согласно https://tour.golang.org/concurrency/1

Goroutine - это легкий поток, управляемый средой выполнения Go.go f(x, y, z) запускает новую процедуру работает f(x, y, z) Оценка f, x, y и z происходит в текущей процедуре , а выполнение f происходит в новая программа .
Программы работают в одном и том же адресном пространстве, поэтому доступ к общей памяти должен быть синхронизирован.Пакет sync предоставляет полезные примитивы, хотя они вам не понадобятся в Go, так как есть другие примитивы.

Так что согласно этому официальному документу main работает в текущей программе .


Теперь давайте повеселимся с main и запустим это (так что здесь текущая программа запускает новую программу ), так что здесьу нас есть более одной процедуры , которые снова выполняют main()!(Примечание: доступ к совместно используемой памяти должен быть синхронизирован):

package main

import (
    "fmt"
    "time"
)

var i = 3

func main() {
    if i <= 0 {
        return
    }
    i--
    fmt.Println("Hi")
    go main()
    time.Sleep(100 * time.Millisecond)
}

вывод:

Hi
Hi
Hi

Давайте вычислим факториал с использованием main() ( одна процедура * 1043)* - синхронизация не требуется):

package main

import "fmt"

func main() {
    if f <= 0 {
        fmt.Println(acc)
        return
    }
    acc *= f
    f--
    main()
}

var f = 5
var acc = 1

вывод:

120

Примечание. Приведенные выше коды предназначены только для четкого отображения моих точек зрения и не подходят для производственного использования (Использование глобальных переменныхне должен быть первым выбором).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...