LINUX.ORG.RU

История изменений

Исправление hummer, (текущая версия) :

В-третьих, тут размер «объекта» крайне мал — пустая структура без полей, зачем создавать лишний указатель? Ты же int’ы не передаёшь указателями. Ладно бы там была структура на 100500 полей, другое дело.

Вот другой пример кода, с полями:

package main

import "fmt"

type animal interface {
	makeSound()
}

type cat struct {
	scratching bool
}

type dog struct {
	biting bool
}

func (c cat) makeSound() {
	fmt.Printf("meow from %p\n", &c)
}

func (d dog) makeSound() {
	fmt.Printf("woof from %p\n", &d)
}

func main() {
	var cat1, dog1 animal = cat{}, dog{}

	fmt.Printf("Using cat from %p and dog from %p\n", &cat1, &dog1)
	cat1.makeSound()
	dog1.makeSound()

	var cat2, dog2 animal = &cat{}, &dog{}

	fmt.Printf("Using cat from %p and dog from %p\n", cat2, dog2)
	cat2.makeSound()
	dog2.makeSound()
}

Напечатает что-то типа:

Using cat from 0xc000042230 and dog from 0xc000042240
meow from 0xc00000a09a
woof from 0xc00000a09b
Using cat from 0xc00000a09c and dog from 0xc00000a09d
meow from 0xc00000a09e
woof from 0xc00000a09f

А если поля закоментировать, то есть вернуться к прежним пустым структурам, то адреса кошки и собаки неожиданно станут почти всегда одинаковыми:

Using cat from 0xc000042230 and dog from 0xc000042240
meow from 0xbb82f8
woof from 0xbb82f8
Using cat from 0xbb82f8 and dog from 0xbb82f8
meow from 0xbb82f8
woof from 0xbb82f8

Похоже на какую-то оптимизацию.

Исходная версия hummer, :

В-третьих, тут размер «объекта» крайне мал — пустая структура без полей, зачем создавать лишний указатель? Ты же int’ы не передаёшь указателями. Ладно бы там была структура на 100500 полей, другое дело.

Вот другой пример кода, с полями:

package main

import "fmt"

type animal interface {
	makeSound()
}

type cat struct {
	scratching bool
}

type dog struct {
	biting bool
}

func (c cat) makeSound() {
	fmt.Printf("meow from %p\n", &c)
}

func (d dog) makeSound() {
	fmt.Printf("woof from %p\n", &d)
}

func main() {
	var cat1, dog1 animal = cat{}, dog{}

	fmt.Printf("Using cat from %p and dog from %p\n", &cat1, &dog1)
	cat1.makeSound()
	dog1.makeSound()

	var cat2, dog2 animal = &cat{}, &dog{}

	fmt.Printf("Using cat from %p and dog from %p\n", cat2, dog2)
	cat2.makeSound()
	dog2.makeSound()
}

Напечатает что-то типа:

Using cat from 0xc000042230 and dog from 0xc000042240
meow from 0xc00000a09a
woof from 0xc00000a09b
Using cat from 0xc00000a09c and dog from 0xc00000a09d
meow from 0xc00000a09e
woof from 0xc00000a09f

А если поля закоментировать, то есть вернуться к прежним пустым структурам, то адреса кошки и собаки неожиданно станут почти всегда одинаковыми:

Using cat from 0xc000042230 and dog from 0xc000042240
meow from 0xbb82f8
woof from 0xbb82f8
Using cat from 0xbb82f8 and dog from 0xbb82f8
meow from 0xbb82f8
woof from 0xbb82f8