-3

why i can't call init function from the other function, init() is just function right, why i can't just call the init function, should i change golang RFC to make it happend

package main

import (
    "fmt"
)

func init() {
    fmt.Println("Hello, playground")
}

func main() {
    go init()
    fmt.Println("Hello, playground")
}

error :

./prog.go:12:8: undefined: init
  • 1
    `init`, like `main`, is a special function. If you want to be able to call its functionality from elsewhere, put it in a different function, and call that function from `init`. – Adrian Jul 24 '19 at 16:25
  • 1
    `init()` functions are special as [described in the specification](https://golang.org/ref/spec#Package_initialization). A function with that name cannot be called by application code. Fix your application by using a different name for the function. Note that the above program has another issue: there's not guarantee that the goroutine will execute before the program exits. – Cerise Limón Jul 24 '19 at 16:26
  • [As the spec says](https://golang.org/ref/spec#Package_initialization): "the init identifier can be used only to declare init functions, yet the identifier itself is not declared. Thus init functions cannot be referred to from anywhere in a program." This is intentional on the part of the language designers. – Adrian Jul 24 '19 at 16:27
  • that's totally different question @tim-cooper – Kipli Antonio Carle Mene Jul 24 '19 at 16:35

2 Answers2

2

The Go Programming Language Specification

Package initialization

the init identifier can be used only to declare init functions, yet the identifier itself is not declared. Thus init functions cannot be referred to from anywhere in a program.


To accomplish your objective, call a function.

For example,

package main

import (
    "fmt"
)

func init() {
    f("init")
}

func f(s string) {
    fmt.Printf("f(%q)\n", s)
}

func main() {
    f("main")
}

Playground: https://play.golang.org/p/isyrCIeYCV4

Output:

f("init")
f("main")
peterSO
  • 134,261
  • 26
  • 231
  • 232
-1

init can not called, it will run when package loaded.

package main

import (
    "fmt"
)

func init() {
    fmt.Println("Hello, playground")
}
func main(){
}

result: Hello, playground

art of go
  • 11
  • 1