-
Что выведет код?
package main import "fmt" type Point struct { X, Y int } func main() { var p Point if p == nil { fmt.Println("true") } else { fmt.Println("false") } }
- true
- false
- Код не скомпилируется
- Код запаникует
Ответ с пояснением
- true
- false
- Код не скомпилируется
- Код запаникует
Объяснение:
nil
- некорректное значение для Point. Поэтому попытка сравнения p сnil
не пройдет компиляцию -
Что выведет код?
package main import "fmt" type Point struct { X, Y int } func main() { var p Point if p == (Point{}) { fmt.Println("true") } else { fmt.Println("false") } }
- true
- false
- Код не скомпилируется
- Код запаникует
Ответ с пояснением
- true
- false
- Код не скомпилируется
- Код запаникует
Объяснение:
Структуры одинакового типа сравниваются на равенство по значению. При этом равенство достигается только в том случае, если все соответствующие элементы структур равны.
-
Что выведет код?
package main import "fmt" type Point struct { X, Y int } func main() { var p Point if p == struct{X,Y int}{} { fmt.Println("true") } else { fmt.Println("false") } }
- true
- false
- Код не скомпилируется
- Код запаникует
Ответ с пояснением
- true
- false
- Код не скомпилируется
- Код запаникует
Объяснение:
Мы объявили собственный тип
Point
на базе структуры из двух типов. При этом вполне допустимо сравниватьPoint
с анонимной структурой такой же сигнатуры -
Что выведет код?
package main import "fmt" type Point struct { X, Y int } type AnotherPoint struct { X, Y int } func main() { var p Point if p == (AnotherPoint{}) { fmt.Println("true") } else { fmt.Println("false") } }
- true
- false
- Код не скомпилируется
- Код запаникует
Ответ с пояснением
- true
- false
- Код не скомпилируется
- Код запаникует
Объяснение:
Сравнение разных собственных типов недопустимо, даже если они под капотом имеет один и тот же тип (в данном случае - структура с полями X и Y). Однако данный код легко можно заставить работать, если явно преобразовать один тип к другому. Например, заменить
(AnotherPoint{})
наPoint(AnotherPoint{})
. Тогда функция выведетtrue
. -
Что выведет код?
package main import "fmt" type Point struct { X, Y int Comments []string } func main() { var p Point if p == (Point{}) { fmt.Println("true") } else { fmt.Println("false") } }
- true
- false
- Код не скомпилируется
- Код запаникует
Ответ с пояснением
- true
- false
- Код не скомпилируется
- Код запаникует
Объяснение:
Объекты типа
Point
нельзя сравнивать ни сnil
, ни друг с другом, поскольку в определении типаPoint
присутствует слайс[]string
, который не поддерживает сравнение на равенство. -
Что выведет код?
package main import "fmt" type Point struct { X int } func (p Point) SetX(newX int) { p.X = newX } func main() { var p Point p.SetX(1) fmt.Println(p.X) }
- 0
- 1
- Код не скомпилируется
- Код запаникует
Ответ с пояснением
- 0
- 1
- Код не скомпилируется
- Код запаникует
Объяснение:
p
- неявный аргумент функцииSetX
. А поскольку все аргументы передаются по значению, то при вызовеSetX
происходит копирование аргументаp
. Здесь происходит модификация копии, которая будет уничтожена после выхода из функции -
Что выведет код?
package main import "fmt" type Point struct { X int } func (p Point) SetX(newX int) { p.X = newX } func main() { p := &Point{} p.SetX(1) fmt.Println(p.X) }
- 0
- 1
- Код не скомпилируется
- Код запаникует
Ответ с пояснением
- 0
- 1
- Код не скомпилируется
- Код запаникует
Объяснение:
p
- неявный аргумент функцииSetX
. Несмотря на то, чтоp
внутри функцииmain
имеет тип*Point
, перед вызовом происходит разыменовывание указателя и копирование полученного значения. ВнутриSetX
происходит модификация копии, которая будет уничтожена после выхода из функции -
Что выведет код?
package main import "fmt" type Point struct { X int } func (p *Point) SetX(newX int) { p.X = newX } func main() { var p Point p.SetX(1) fmt.Println(p.X) }
- 0
- 1
- Код не скомпилируется
- Код запаникует
Ответ с пояснением
- 0
- 1
- Код не скомпилируется
- Код запаникует
Объяснение:
Перед вызовом
SetX
неявно происходит взятие указателя. ВнутриSetX
происходит модификация значения по указателю (т.е. по адресу в памяти), который указывает на область памяти переменнойvar p Point
из функцииmain
. Поэтому эти изменения сохранятся даже после завершения вызова функции. -
Что выведет код?
package main import "fmt" type Point struct { X int } func (p *Point) Description() string { return "Hello" } func main() { var p *Point fmt.Println(p.Description()) }
- Hello
- Код не скомпилируется
- Код запаникует
Ответ с пояснением
- Hello
- Код не скомпилируется
- Код запаникует
Объяснение:
Zero-value для типа
*Point
-nil
. Поскольку тип получателя совпадает с типом переменнойvar p *Point
, тоnil
передается в качестве неявного аргумента функцииDescription
"как есть". Поскольку он никак не используется, то никаких ошибок во время выполнения не происходит. -
Что выведет код?
package main import "fmt" type Point struct { X int } func (p Point) Description() string { return "Hello" } func main() { var p *Point fmt.Println(p.Description()) }
- Hello
- Код не скомпилируется
- Код запаникует
Ответ с пояснением
- Hello
- Код не скомпилируется
- Код запаникует
Объяснение:
Zero-value для типа
*Point
-nil
. Поскольку тип получателя функции не совпадает с типом переменнойvar p *Point
, то перед вызовом функцииDescription
происходит разыменовывание nil-указателя, которое приводит к паникеpanic: runtime error: invalid memory address or nil pointer dereference
This repository has been archived by the owner on Dec 5, 2021. It is now read-only.