Как установить указатель bool в true в struct literal?
У меня есть функция, ниже которой принимается указатель bool. Мне интересно, есть ли какая-либо нотация, которая позволяет мне установить значение поля is
в true
в строковом литерале; в основном без определения нового идентификатора (i.e. var x := true ; handler{is: &x} )
package main
import "fmt"
func main() {
fmt.Println("Hello, playground")
check(handler{is: new(bool) })
}
type handler struct{
is *bool
}
func check(is handler){}
Ответы
Ответ 1
Вы можете это сделать, но это не оптимально:
h := handler{is: &[]bool{true}[0]}
fmt.Println(*h.is) // Prints true
В основном он создает срез с одним bool
значения true
, индексирует его первый элемент и берет его адрес. Никакой новой переменной не создается, но есть много шаблонов (и массив поддержки останется в памяти до тех пор, пока не будет найден адрес его первого элемента).
Лучшим решением было бы написать вспомогательную функцию:
func newTrue() *bool {
b := true
return &b
}
И используя его:
h := handler{is: newTrue()}
fmt.Println(*h.is) // Prints true
Вы также можете сделать это с помощью однолинейной анонимной функции:
h := handler{is: func() *bool { b := true; return &b }()}
fmt.Println(*h.is) // Prints true
Или вариант:
h := handler{is: func(b bool) *bool { return &b }(true)}
Чтобы просмотреть все ваши варианты, посмотрите мой другой ответ: Как сделать буквенный * int64 в Go?
Ответ 2
Нет.
Нет синтаксиса для определения указателя на примитивный тип, кроме нулевого значения, возвращаемого new
. То же самое относится к числовым типам и строкам.
Вам нужно либо создать значение перед рукой, чтобы принять адрес, либо создать указатель с нулевым значением, и назначить новое значение после факта.
Ответ 3
Одна из причин, по которой указатели полезны в go или любом другом языке, это то, что они помогают нам "проходить по ссылке". Поэтому, если мы передадим что-либо по ссылке, мы сможем "изменить" эту вещь. Функция, которая берет указатель на bool, может эффективно изменить значение bool даже после возвращения функции. Это то, чего мы не хотим с константами, т.е. их значения не должны меняться. Следовательно, это ограничение имеет смысл.
Помимо трюков, упомянутых выше icza
, хотелось бы добавить здесь пункт. В основном мы используем указатели вместо bools вместо bools, чтобы эффективно использовать значение nil указателей, которое в противном случае должно быть истинным или ложным. Если это так, то вы можете использовать необязательные флаги bool непосредственно в функциях, вместо того чтобы иметь указатели на bool или даже структуру, обертывающие один указатель bool, как показано в вашем примере, устраняя полное требование структуры даже.. Теперь, конечно, если структура по какой-либо другой причине, вы можете очень хорошо использовать любой из трюков icza
выше.
Btw, вы можете напрямую получить копию значения bool для использования адреса, как показано ниже.
const check = true
chk := check
fmt.Println(&chk) // will give you the address of chk
chk = false
fmt.Println(chk) // will print false
fmt.Println(check) // will print true