不论是rt0_go还是go语法(如果在有idle的状况下)最终都会调用mstart

mstart

// mstart is the entry-point for new Ms.//// This must not split the stack because we may not even have stack// bounds set up yet.//// May run during STW (because it doesn't have a P yet), so write// barriers are not allowed.////go:nosplit//go:nowritebarrierrecfunc mstart() {    _g_ := getg()    osStack := _g_.stack.lo == 0    if osStack {        // Initialize stack bounds from system stack.        // Cgo may have left stack size in stack.hi.        // minit may update the stack bounds.        //        // Note: these bounds may not be very accurate.        // We set hi to &size, but there are things above        // it. The 1024 is supposed to compensate this,        // but is somewhat arbitrary.        size := _g_.stack.hi        if size == 0 {            size = 8192 * sys.StackGuardMultiplier        }        _g_.stack.hi = uintptr(noescape(unsafe.Pointer(&size)))        _g_.stack.lo = _g_.stack.hi - size + 1024    }    // Initialize stack guard so that we can start calling regular    // Go code.    _g_.stackguard0 = _g_.stack.lo + _StackGuard    // This is the g0, so we can also call go:systemstack    // functions, which check stackguard1.    _g_.stackguard1 = _g_.stackguard0    mstart1()    // Exit this thread.    if mStackIsSystemAllocated() {        // Windows, Solaris, illumos, Darwin, AIX and Plan 9 always system-allocate        // the stack, but put it in _g_.stack before mstart,        // so the logic above hasn't set osStack yet.        osStack = true    }    mexit(osStack)}