Как установить указатель 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