make length golang funcion array pointers go struct literals

pointers - length - golang size



¿Cómo establecer el puntero bool en true en struct literal? (3)

No.

No hay sintaxis para definir un puntero a un tipo primitivo, que no sea el valor cero devuelto por new . Lo mismo ocurre con los tipos numéricos y las cadenas.

O bien debe crear un valor de antemano para tomar la dirección de, o crear el puntero con un valor cero y asignar un nuevo valor después del hecho.

Tengo la función debajo de la cual acepta un puntero bool. Me pregunto si hay alguna notación que me permita establecer el valor del campo is en true en la estructura literal; básicamente sin definir un nuevo identificador (ie 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){}


Puedes hacer eso pero no es óptimo:

h := handler{is: &[]bool{true}[0]} fmt.Println(*h.is) // Prints true

Básicamente, crea una porción con un valor de true , indexa su primer elemento y toma su dirección. No se crea una nueva variable, pero hay una gran cantidad de repeticiones (y la matriz de respaldo permanecerá en la memoria hasta que exista la dirección de su primer elemento).

Una mejor solución sería escribir una función auxiliar:

func newTrue() *bool { b := true return &b }

Y usándolo:

h := handler{is: newTrue()} fmt.Println(*h.is) // Prints true

También puedes hacerlo con una función anónima de una sola línea:

h := handler{is: func() *bool { b := true; return &b }()} fmt.Println(*h.is) // Prints true

O una variante:

h := handler{is: func(b bool) *bool { return &b }(true)}

Para ver todas tus opciones, revisa mi otra respuesta: ¿Cómo hago un literal * int64 en Go?


Una de las razones por las que los punteros son útiles para ir o para cualquier otro idioma es que nos ayudan a "pasar por referencia". Entonces, si pasamos algo por referencia, podemos "cambiar" esa cosa. Una función que toma un puntero a bool, puede cambiar el valor del bool efectivamente incluso después de que la función regrese. Esto es lo que no queremos con las constantes, es decir. Sus valores no deben cambiar. Por lo tanto, esta restricción tiene sentido.

Aparte de los trucos mencionados anteriormente por icza , querría agregar un punto aquí. Principalmente, usamos punteros a bools en lugar de bools directamente para usar el valor nulo de los punteros de manera efectiva, que de lo contrario tienen que ser verdaderos o falsos. Si ese es el caso, entonces es posible que desee utilizar indicadores bool opcionales directamente en las funciones, en lugar de tener punteros a bool o incluso una estructura que contenga el único puntero bool como se muestra en su ejemplo, eliminando el requisito completo de una estructura. incluso .. Ahora, por supuesto, si la estructura es requerida por cualquier otra razón, puedes usar cualquiera de los trucos de icza arriba. Por cierto, puede tener directamente una copia del valor bool para usar la dirección de la siguiente manera también.

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