{"id":36781504,"url":"https://github.com/hedisam/goactor","last_synced_at":"2026-01-12T13:17:27.891Z","repository":{"id":57518254,"uuid":"309004240","full_name":"hedisam/goactor","owner":"hedisam","description":"Actor Model with an Erlang/Elixir API style in Go","archived":false,"fork":false,"pushed_at":"2025-02-01T23:27:19.000Z","size":3156,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-02T00:24:41.379Z","etag":null,"topics":["actor-model","actorsystem","elixir-lang","erlang","go","golang"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hedisam.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-11-01T01:42:55.000Z","updated_at":"2025-01-01T23:57:02.000Z","dependencies_parsed_at":"2024-11-09T20:19:12.625Z","dependency_job_id":null,"html_url":"https://github.com/hedisam/goactor","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/hedisam/goactor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hedisam%2Fgoactor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hedisam%2Fgoactor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hedisam%2Fgoactor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hedisam%2Fgoactor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hedisam","download_url":"https://codeload.github.com/hedisam/goactor/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hedisam%2Fgoactor/sbom","scorecard":{"id":459503,"data":{"date":"2025-08-11","repo":{"name":"github.com/hedisam/goactor","commit":"332f9b290c621f4e1d19d56072bb06c9faec87f1"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.6,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T10:43:14.760Z","repository_id":57518254,"created_at":"2025-08-19T10:43:14.760Z","updated_at":"2025-08-19T10:43:14.760Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28338996,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-12T12:22:26.515Z","status":"ssl_error","status_checked_at":"2026-01-12T12:22:10.856Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["actor-model","actorsystem","elixir-lang","erlang","go","golang"],"created_at":"2026-01-12T13:17:27.023Z","updated_at":"2026-01-12T13:17:27.879Z","avatar_url":"https://github.com/hedisam.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GoActor\nGo Actor Model with an Erlang/Elixir API style.\n\nInspired by Erlang/Elixir's concurrency model, goactor provides a toolkit to spawn and supervise isolated processes that can safely run codes which could panic, without affecting either other processes or the rest of your program.\n\n#### Not familiar with Actor Model?\nWell, simply put based on definition, the Actor Model defines a concurrency model where an Actor is a process completely isolated from the rest of the program, with no memory being shared between the actors, and the only way to communicate with them is through exchanging messages.\n\n## Contents\n* [Todo](https://github.com/hedisam/goactor#todo)\n* [How to install it?](https://github.com/hedisam/goactor#how-to-install-it)\n* [How to use it?](https://github.com/hedisam/goactor#how-to-use-it)\n* [A basic example](https://github.com/hedisam/goactor#a-basic-example)\n* [Monitoring \u0026 Parent actor](https://github.com/hedisam/goactor#monitoring--parent-actor)\n* [Link to another actor](https://github.com/hedisam/goactor#link-to-another-actor)\n\t* [Trap Exit functionality](https://github.com/hedisam/goactor#link--trap-exit)\n* [Register an actor with a name](https://github.com/hedisam/goactor#register-an-actor-with-a-name)\n* [Supervisors \u0026 Supervision tree](https://github.com/hedisam/goactor/blob/master/README.md#supervisor--supervision-tree)\n\n## Todo:\n* Complete this README\n* Distributed actors (using gRPC?)\n* Finish the TODOs in the code \n* Writing tests for the supervisor package\n* Refactoring (simplify) the supervisor package \n* Refactoring error messages and comments, also comment out the remaining parts.\n* Document the project\n* Logging \n\n## How to install it?\n Using `go get` command in your terminal: `go get -u github.com/hedisam/goactor` or if your project has go modules enabled, just import the package `github.com/hedisam/goactor` and then run `go mod tidy`.\n\n## How to use it?\nTo spawn a process, we need a function which we'd like to call it Actor function since it needs to have the signature of `goactor.ActorFunc` that looks like this:\n```golang\ntype ActorFunc func(actor *Actor)\n```\nSo any function that implements `goactor.ActorFunc` type will fit our needs.\n\n### A basic example\nLet's spawn an echo actor and send it a message:\n\n```golang\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/hedisam/goactor\"\n\t\"log\"\n\t\"time\"\n)\n\nfunc main() {\n\t// Spawn returns a PID which can be used to send message to the actor\n\tpid := goactor.Spawn(echo, nil) // [*1]\n\n\t// Send takes the pid of the target actor and a message to send\n\terr := goactor.Send(pid, \"Hello, Actor\") // [*2]\n\tif err != nil {\n\t\tlog.Println(err)\n\t}\n\n\t// let's wait a bit to make sure echo gets the chance of printing the message\n\t\u003c-time.After(100 * time.Millisecond) // [*3]\n}\n\n// echo is our actor function (aka our actor's body)\nfunc echo(actor *goactor.Actor) {\n\t// this is the body of our actor. echo actor will be running until this function returns.\n\t\n\t// [*4]\n\t// Receive accepts a MessageHandler function. It will block until its message handler\n\t// returns false.\n\terr := actor.Receive(func(message interface{}) (loop bool) {\n\t\tfmt.Printf(\"[+] Echo received: %v\\n\", message)\n\t\treturn false\n\t})\n\tif err != nil {\n\t\tlog.Println(err)\n\t}\n}\n```\nSo given the actor function, echo, we use the Spawn function to start an isolated actor. The spawned actor is just the echo function, and it will be alive and running as long as the echo function has not returned.\n\n_[*1]_ `goactor.Spawn` takes two parameters, the first is our actor func, and the second one is a `mailbox builder` which we will talk about it later. It returns a `PID` (process identifier) which is used to send messages to the actor.\n\n_[*2]_ `goactor.Send` takes two parameters as well, the target actor's PID and the message to send. It returns an error in case of a disposed mailbox (which happens when the actor is no longer alive), or due to a mailbox's push timeout which you can set using a mailbox builder when you spawn your actor.\n\n_[*3]_ As you know, the **main goroutine** doesn't wait for other concurrent goroutines to finish, therefore you may not see the result of their work. Since **the building block of our actors are goroutines**, we need to make sure that our echo actor has enough time to show the result of its work.\n\n_[*4]_ `goactor.Receive` accepts a message handler function with a signature of `goactor.MessageHandler`. Here's its signature: `func(message interface{}) (loop bool)`. The method `goactor.Receive` blocks the routine and processes the messages saved in the mailbox by dispatching them to our `MessageHandler` one by one until the handler returns `false`. If no messages are in the mailbox, it will listen for new ones to be received and processed. Your `MessageHandler` should return `true` if you want to process more messages. Note that returning `false` inside your `MessageHandler` does not stop the mailbox from receiving new messages. `goactor.Receive` returns an error if the mailbox is closed.\n\n**NOTE:** no goroutines should be spawned inside an actor (aka actor function) because an unhandled panic in that goroutine will spread out to the entire program.\n\n### Monitoring \u0026 Parent actor\nTo receive a message you need to use an actor's receive method (e.g. `actor.Receive(...)` and that implies you to be within the actor's `ActorFunc` body but sometimes you want to receive and process a message outside of an actor's boundary. That's when you can embrace a `Parent` actor which doesn't need to be spawned.\n\nHere we create a parent actor to `Monitor` another one that is supposed to panic. So we get notified when it panics/exits.\n\n```golang\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/hedisam/goactor\"\n\t\"github.com/hedisam/goactor/sysmsg\"\n\t\"log\"\n\t\"time\"\n)\n\nfunc main() {\n\t// NewParentActor accepts a mailbox builder function (MailboxBuilderFunc) as its parameter, just like the\n\t// second argument of goactor.Spawn\n\t// MailboxBuilderFunc can be used to provide a customized mailbox to the actor.\n\tparent, dispose := goactor.NewParentActor(nil)\n\tdefer dispose() // don't forget to defer the dispose function of a parent actor\n\n\tiPanicPID := goactor.Spawn(iWillPanic, nil)\n\n\t// when you monitor another actor, you expect to get notified about anything (bad) that happens to the target actor.\n\terr := parent.Monitor(iPanicPID)\n\tif err != nil {\n\t\tlog.Println(err)\n\t\treturn\n\t}\n\n\t// let's send a message to the iWillPanic actor which is supposed to panic as soon as it wants to process the message\n\terr = goactor.Send(iPanicPID, \"No matter what message it is, it cause you to panic\")\n\tif err != nil {\n\t\tlog.Println(err)\n\t\treturn\n\t}\n\n\t// ReceiveWithTimeout returns a timeout error if no messages came through by the specified timeout\n\terr = parent.ReceiveWithTimeout(time.Millisecond * 100, func(message interface{}) (loop bool) {\n\t\tswitch msg := message.(type) {\n\t\tcase sysmsg.SystemMessage:\n\t\t\tfmt.Printf(\"[+] parent received a system message from %s: %v\", msg.Sender().ID(), msg)\n\t\t}\n\t\treturn false\n\t})\n\tif err != nil {\n\t\tlog.Println(err)\n\t}\n}\n\nfunc iWillPanic(actor *goactor.Actor) {\n\t_ = actor.Receive(func(message interface{}) (loop bool) {\n\t\t// after panic-ing, iWillPanic actor broadcasts a specific system message of type sysmsg.SystemMessage so\n\t\t// any actor that's linked or monitoring this one will receive the message.\n\t\tpanic(message)\n\t})\n}\n\n```\nAnd here's the output:\n```\n2021/05/05 16:32:04 dispose: actor a8895eb4-302c-4ed9-86f5-3aada8b5c8c6 had a panic, reason: No matter what message it is, it cause you to panic\n[+] parent received a system message from a8895eb4-302c-4ed9-86f5-3aada8b5c8c6: {0xc00016a140 No matter what message it is, it cause you to panic \u003cnil\u003e}\n```\nThe first line of the output is a log message internally printed by the panic-ed actor, and the second one is the message received and printed by our parent actor.\n\nYou don't need to spawn an `ActorFunc` function to create a `parent` actor since it works and runs in the same goroutine you use to create it (in our example it would be the main goroutine). So it's important to know it can only survive from panics that happen within its goroutine's boundaries.\n\n### Link to another actor\nWe use the previous example but instead of monitoring the 'iWillPanic' actor, we `Link` our parent actor to it. \nThe difference between `Monitor` and `Link` is that if an actor exit abnormally (e.g. panics), all of its linked actors will exit, too, while a monitor actor only gets notified with no harm in such situations. Also, `Link` creates a two-way relationship between the actors, so either one if exits abnormally causes the other to exit, too.\n\nHere we expect our parent actor to exit along with its linked 'iWillPanic' one:\n\n```golang\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/hedisam/goactor\"\n\t\"github.com/hedisam/goactor/sysmsg\"\n\t\"log\"\n\t\"time\"\n)\n\nfunc main() {\n\tparent, dispose := goactor.NewParentActor(nil)\n\tdefer dispose()\n\n\tiPanicPID := goactor.Spawn(iWillPanic, nil)\n\n\t///////////////////////////\n\t// the following line of code has changed compared to the previous sample code\n\t//////////////////////////\n\t// our parent actor will panic/exit if its linked actor panics\n\terr := parent.Link(iPanicPID)\n\tif err != nil {\n\t\tlog.Println(err)\n\t\treturn\n\t}\n\n\t// let's send a message to iWillPanic actor which is supposed to panic as soon as it wants to process the message\n\terr = goactor.Send(iPanicPID, \"No matter what message it is, it cause you to panic\")\n\tif err != nil {\n\t\tlog.Println(err)\n\t\treturn\n\t}\n\t\n\t/////////////////\n\t// the following receive method should not get any messages since the parent actor will exit along\n\t// with 'iWillPanic'\n\t////////////////\n\t// ReceiveWithTimeout returns a timeout error if no messages came through by the specified timeout\n\terr = parent.ReceiveWithTimeout(time.Millisecond * 100, func(message interface{}) (loop bool) {\n\t\tswitch msg := message.(type) {\n\t\tcase sysmsg.SystemMessage:\n\t\t\tfmt.Printf(\"[+] parent received a system message from %s: %v\", msg.Sender().ID(), msg)\n\t\t}\n\t\treturn false\n\t})\n\tif err != nil {\n\t\tlog.Println(err)\n\t}\n}\n\nfunc iWillPanic(actor *goactor.Actor) {\n\t_ = actor.Receive(func(message interface{}) (loop bool) {\n\t\t// after panic-ing, iWillPanic actor broadcasts a specific system message of type sysmsg.SystemMessage so\n\t\t// any actor that's linked or monitoring this one will receive the message.\n\t\tpanic(message)\n\t})\n}\n\n```\nAnd here's the output:\n```\n2021/05/05 18:10:20 dispose: actor 48804599-d184-40a7-85fc-3973f0e3f729 had a panic, reason: No matter what message it is, it cause you to panic\n2021/05/05 18:10:20 actor 6173556d-8ae4-4e6c-a35e-f0b51e0ed8e9 received an abnormal exit message from 48804599-d184-40a7-85fc-3973f0e3f729, reason: No matter what message it is, it cause you to panic\n```\nThe actor with id `48804599-d184-40a7-85fc-3973f0e3f729` is the 'iWillPanic' actor whose panic has been handled.\nIn the second log message you can see the actor with id `6173556d-8ae4-4e6c-a35e-f0b51e0ed8e9` which is our parent actor. The log message shows that it has exited because of receiving an abnormal exit message that is due to being linked to an actor that has panic-ed.\n\nNote that the second log message has been printed by the parent actor's internal methods and not by its `ReceiveWithTimeout` written in the sample code.\n\n#### Link \u0026 Trap Exit\nWhen an actor exits or gets terminated, it notifies its linked (and monitor) actors by broadcasting a system message which will be handled internally by the actors that receive it. But what if you wanted to handle this kind of system messages by yourself? Well, you can just do that by trapping exit messages.\u003cbr/\u003e \nFrom the example below, you can see that the parent actor will not panic as it did in the previous example since we've set trap exit to true for it.\n\n```golang\npackage main\n\nimport (\n\t\"fmt\"\n\t\"github.com/hedisam/goactor\"\n\t\"github.com/hedisam/goactor/mailbox\"\n\t\"github.com/hedisam/goactor/sysmsg\"\n\t\"log\"\n\t\"time\"\n)\n\nfunc main() {\n\t// let's provide each of our actors a different customized mailbox\n\tqueueMailboxBuilder := func() goactor.Mailbox {\n\t\treturn mailbox.NewQueueMailbox(5, 5, 100 * time.Millisecond, mailbox.DefaultGoSchedulerInterval)\n\t}\n\tchanMailboxBuilder := func() goactor.Mailbox {\n\t\treturn mailbox.NewChanMailbox(5, 5, 100 * time.Millisecond)\n\t}\n\n\tparent, dispose := goactor.NewParentActor(queueMailboxBuilder)\n\tdefer dispose()\n\n\t// by trapping exit messages the parent actor can survive if its linked actors panic or exit abnormally\n\tparent.SetTrapExit(true)\n\n\tiPanicPID := goactor.Spawn(iWillPanic, chanMailboxBuilder)\n\n\terr := parent.Link(iPanicPID)\n\tif err != nil {\n\t\tlog.Println(err)\n\t\treturn\n\t}\n\n\t// let's send a message to iWillPanic actor which is supposed to panic as soon as it wants to process the message\n\terr = goactor.Send(iPanicPID, \"No matter what message it is, it cause you to panic\")\n\tif err != nil {\n\t\tlog.Println(err)\n\t\treturn\n\t}\n\n\t// we expect to receive a system message since the parent actor is trapping exit messages\n\terr = parent.ReceiveWithTimeout(time.Millisecond * 100, func(message interface{}) (loop bool) {\n\t\tswitch msg := message.(type) {\n\t\tcase sysmsg.SystemMessage:\n\t\t\tfmt.Printf(\"[+] parent received a system message from %s: %v\\n\", msg.Sender().ID(), msg)\n\t\t}\n\t\treturn false\n\t})\n\t// receive timeout is not going to get triggered so this err should be nil\n\tif err != nil {\n\t\tlog.Println(err)\n\t}\n\n\tfmt.Println(\"[!] parent actor is ok\")\n}\n\nfunc iWillPanic(actor *goactor.Actor) {\n\t_ = actor.Receive(func(message interface{}) (loop bool) {\n\t\t// after panic-ing, iWillPanic actor broadcasts a specific system message of type sysmsg.SystemMessage so any\n\t\t// actor that's linked or monitoring this one will receive the message.\n\t\tpanic(message)\n\t})\n}\n\n```\nOutput:\n```\n[+] parent received a system message from caba2187-b9bd-4cab-9ce6-e6ebe3bce584: {0xc000040180 No matter what message it is, it cause you to panic \u003cnil\u003e}\n[!] parent actor is ok\n2021/05/11 18:18:34 dispose: actor caba2187-b9bd-4cab-9ce6-e6ebe3bce584 had a panic, reason: No matter what message it is, it cause you to panic\n```\nThe first two lines are `fmt` messages printed by the `parent` actor and the last one is a `log` message which belongs to the `iWillPanic` actor that shows it has panic-ed. The `log` message should've been printed in the first line but be aware that printing `log` messages take a bit longer compared to normal `fmt` ones so don't get confused by the order of the print.\u003cbr/\u003e\nNevertheless, you can see that the `parent` actor has not panic-ed and has exited normally.\n### Register an actor with a name\nIts How-to-do to be added in the next following days\n### Supervisor \u0026 Supervision tree\nIts How-to-do to be added in the next following days\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhedisam%2Fgoactor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhedisam%2Fgoactor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhedisam%2Fgoactor/lists"}