// run | |
// Copyright 2021 The Go Authors. All rights reserved. | |
// Use of this source code is governed by a BSD-style | |
// license that can be found in the LICENSE file. | |
package main | |
type iface interface { | |
Get() int | |
} | |
//go:notinheap | |
type notInHeap struct { | |
i int | |
} | |
type myInt struct { | |
f *notInHeap | |
} | |
func (mi myInt) Get() int { | |
return int(mi.f.i) | |
} | |
type embed struct { | |
*myInt | |
} | |
var val = 1234 | |
var valNotInHeap = notInHeap{val} | |
func main() { | |
i := val | |
check(i) | |
mi := myInt{f: &valNotInHeap} | |
check(mi.Get()) | |
ifv := iface(mi) | |
check(ifv.Get()) | |
ifv = iface(&mi) | |
check(ifv.Get()) | |
em := embed{&mi} | |
check(em.Get()) | |
ifv = em | |
check(ifv.Get()) | |
ifv = &em | |
check(ifv.Get()) | |
} | |
func check(v int) { | |
if v != val { | |
panic(v) | |
} | |
} |