2016-09-17 15:04:36 -07:00
|
|
|
// Copyright 2016 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.
|
|
|
|
|
|
2020-12-23 01:09:46 -05:00
|
|
|
package test
|
|
|
|
|
|
|
|
|
|
import "testing"
|
2016-09-17 15:04:36 -07:00
|
|
|
|
|
|
|
|
// Test to make sure we make copies of the values we
|
|
|
|
|
// put in interfaces.
|
|
|
|
|
|
|
|
|
|
var x int
|
|
|
|
|
|
|
|
|
|
func TestEfaceConv1(t *testing.T) {
|
|
|
|
|
a := 5
|
|
|
|
|
i := interface{}(a)
|
|
|
|
|
a += 2
|
|
|
|
|
if got := i.(int); got != 5 {
|
|
|
|
|
t.Errorf("wanted 5, got %d\n", got)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestEfaceConv2(t *testing.T) {
|
|
|
|
|
a := 5
|
|
|
|
|
sink = &a
|
|
|
|
|
i := interface{}(a)
|
|
|
|
|
a += 2
|
|
|
|
|
if got := i.(int); got != 5 {
|
|
|
|
|
t.Errorf("wanted 5, got %d\n", got)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestEfaceConv3(t *testing.T) {
|
|
|
|
|
x = 5
|
|
|
|
|
if got := e2int3(x); got != 5 {
|
|
|
|
|
t.Errorf("wanted 5, got %d\n", got)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//go:noinline
|
|
|
|
|
func e2int3(i interface{}) int {
|
|
|
|
|
x = 7
|
|
|
|
|
return i.(int)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestEfaceConv4(t *testing.T) {
|
|
|
|
|
a := 5
|
|
|
|
|
if got := e2int4(a, &a); got != 5 {
|
|
|
|
|
t.Errorf("wanted 5, got %d\n", got)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//go:noinline
|
|
|
|
|
func e2int4(i interface{}, p *int) int {
|
|
|
|
|
*p = 7
|
|
|
|
|
return i.(int)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type Int int
|
|
|
|
|
|
|
|
|
|
var y Int
|
|
|
|
|
|
|
|
|
|
type I interface {
|
|
|
|
|
foo()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (i Int) foo() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestIfaceConv1(t *testing.T) {
|
|
|
|
|
a := Int(5)
|
|
|
|
|
i := interface{}(a)
|
|
|
|
|
a += 2
|
|
|
|
|
if got := i.(Int); got != 5 {
|
|
|
|
|
t.Errorf("wanted 5, got %d\n", int(got))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestIfaceConv2(t *testing.T) {
|
|
|
|
|
a := Int(5)
|
|
|
|
|
sink = &a
|
|
|
|
|
i := interface{}(a)
|
|
|
|
|
a += 2
|
|
|
|
|
if got := i.(Int); got != 5 {
|
|
|
|
|
t.Errorf("wanted 5, got %d\n", int(got))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestIfaceConv3(t *testing.T) {
|
|
|
|
|
y = 5
|
|
|
|
|
if got := i2Int3(y); got != 5 {
|
|
|
|
|
t.Errorf("wanted 5, got %d\n", int(got))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//go:noinline
|
|
|
|
|
func i2Int3(i I) Int {
|
|
|
|
|
y = 7
|
|
|
|
|
return i.(Int)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestIfaceConv4(t *testing.T) {
|
|
|
|
|
a := Int(5)
|
|
|
|
|
if got := i2Int4(a, &a); got != 5 {
|
|
|
|
|
t.Errorf("wanted 5, got %d\n", int(got))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//go:noinline
|
|
|
|
|
func i2Int4(i I, p *Int) Int {
|
|
|
|
|
*p = 7
|
|
|
|
|
return i.(Int)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BenchmarkEfaceInteger(b *testing.B) {
|
|
|
|
|
sum := 0
|
|
|
|
|
for i := 0; i < b.N; i++ {
|
|
|
|
|
sum += i2int(i)
|
|
|
|
|
}
|
|
|
|
|
sink = sum
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//go:noinline
|
|
|
|
|
func i2int(i interface{}) int {
|
|
|
|
|
return i.(int)
|
|
|
|
|
}
|