1 ctrl+shift+d depurar
2 ctrl+shift+x administrar extensiones
3 Configurar la finalización automática
go env -w GOPROXY=https://goproxy.cn,direct
Presione en la plataforma Windows Ctrl+Shift+P
y en la plataforma Mac. Command+Shift+P
En este momento, aparecerá un cuadro de entrada en la interfaz de VS Code, como se muestra en la siguiente figura: >ir:instalar Ir:Herramientas de instalación/actualización
Establecer guardado automático
Ajuste de Preferencias de archivo afterdelay
4 Ver errores y advertencias ctrl+shift+M
5Cambie el terminal integrado ctrl+ ·
ajuste.json
“ir.useCodeSnippetsOnFunctionSuggest”: verdadero
6 Aparecerá un cuadro justo encima de Ctrl+Shift+P para abrir la línea de comando
Si el suyo Windows
está usando cmd
, especifique la variable de entorno de la siguiente manera.
SET CGO_ENABLED=0 // 禁用CGO
SET GOOS=linux // 目标平台是linux
SET GOARCH=amd64 // 目标处理器架构是amd64
Si Windows
está utilizando PowerShell
una terminal, la sintaxis para establecer variables de entorno es
$ENV:CGO_ENABLED=0
$ENV:GOOS="linux"
$ENV:GOARCH="amd64"
7Linux compila ejecutables de Mac
Compile el programa ejecutable de la plataforma Mac de 64 bits bajo la plataforma Linux:
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
Linux compila ejecutables de Windows
Compile el programa ejecutable de 64 bits de la plataforma Windows en la plataforma Linux:
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
variables y constantes
variable
definición de variable
var a int
var b bool
var c int8
var (
m int
n string
)
var name string = "nazha"
func main(){
age := 18//声明变量age同时初始化;编译器会根据右边的初始值推断出age是什么类型
}
constante
const PI = 3.1415926
const KB = 1024
iota
La enumeración se implementa con iota en Go
const (
n1 = iota //0
n2 //1
n3 //2
n4 //3
)
-
iota
Se restablecerá a 0 cuando aparezca la palabra clave const -
Cada nueva línea de declaración constante en const sumará
iota
una vez -
Si no hay contenido después de la constante declarada por const, será consistente con la línea anterior por defecto.
tipo de datos básicos
Cadena
Use comillas dobles para 字符串
"hola"
Use comillas simples para 字符
'h'
Métodos comunes para cadenas
entero
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64
Int es especial, se determinará de acuerdo con la cantidad de dígitos de su sistema operativo, ya sea int32 o int64
punto flotante
flotar32 flotar64
Los números de punto flotante siempre son inexactos (¿Por qué los números de punto flotante representados por las computadoras son inexactos?)
-
Convertir a una cadena para hacer operaciones
-
Cuántas veces la ampliación general se convierte en un número entero para el cálculo
plural
complejo64 y complejo128
booleano
var a bool//默认是false
var b = true
El tipo booleano en el lenguaje Go no se puede convertir a otros tipos
byte y runa
Los caracteres ingleses se representan por byte (se puede representar el código ASCII) 01010101
runa (chino, codificación UTF8) 01010101 01010101 01010101
¿Cuándo usar la runa?
s := "hello中国"
for i:=0;i<len(s);i++{
fmt.
}
Vea el código de clase para más detalles.
control de procesos
si
age := 20
if age>18{
}else if 20 > 18 {
}else{
}
//此时age只在if语句中有效
if age:=20;age>18{
}
para
//标准for循环
for i:=0;i<10;i++{
}
//类似while循环
n := 10
for n>0 {
fmt.Println(n)
n--
}
//无限循环
for {
}
interruptor y caja
n := 10
switch n{
case 1:
...
case 2:
...
}
switch {
case n>0:
...
case n ==0:
...
}
Para compatibilidad con el código C anteriorfallthrough
Lo siguiente es para entender
ir a+etiqueta
continuar+etiqueta
romper +etiqueta
Operación
operador
Tarea
Convierta la dirección IP de cadena "192.168.19.200" en un número entero
Parámetros para formatear e imprimir
fmt.Println()
fmt.Printf("%s")
formación
Una matriz es una colección de elementos del mismo tipo de datos .
definición de declaración
inicialización
Matriz bidimensional
recorrido de la matriz
Las matrices son tipos de valores.
compartir la tarde
Cuando sientas que no puedes hacerlo, puedes salir a caminar por la acera, en ese momento eres un peatón.
rebanada
Tres elementos de corte:
- Dirección (el espacio de memoria al que apunta el primer elemento del segmento)
- tamaño (el número de elementos actualmente en el segmento)
len()
- Capacidad (la cantidad máxima de elementos que se pueden almacenar en la matriz subyacente)
cap()
Slicing admite la expansión automática y hay 3 estrategias de expansión
-
Solo se agrega un elemento cada vez, y cada vez es el doble de la vez anterior
-
Sumar más de 1 vez la capacidad original es igual al número par más cercano de la capacidad original + el número de elementos de expansión
-
Si la capacidad de la rebanada es mayor que 1024, ¿la expansión subsiguiente será 0,25 veces cada vez?
Agregar elementos a la división
append()
La función es añadir elementos a la rebanada.
a = append(a, 1)
Hay tres formas de obtener rebanadas:
- Declarar directamente
a := []int{1,2,3}
len:3 cap:3 - Obtenga el segmento
m := [5]int b:= m[:3]
len: 3, cap: 5 según la matriz - Obtener segmento basado en segmento
b := a[:2]
len: 2 cap: 3
Inicializar rebanadas con make
make se usa para solicitar espacio de memoria para tipos de referencia
Los segmentos deben inicializarse o agregarse para ser utilizados
var s []int
s = make([]int, 大小, 容量)
Al inicializar el segmento, la capacidad debe ser lo más grande posible para reducir la necesidad de una expansión dinámica durante la ejecución del programa.
mapa
definición de mapa
映射
, estructura clave-valor
var n map[string]int
inicialización del mapa
make(map[string]int, [容量])
Recorrido del mapa
para ... bucle de rango
parámetro variable
func add4(a int, b ...int) int {
}
¡Solo puede haber un parámetro variable y solo se puede colocar al final del parámetro! ! !
¡No hay parámetros predeterminados en el idioma Go! ! !
múltiples valores de retorno
func add5() (int, int, int) {
return 1, 2, 3
}
variables y constantes
variable
definición de variable
var a int
var b bool
var c int8
var (
m int
n string
)
var name string = "nazha"
func main(){
age := 18//声明变量age同时初始化;编译器会根据右边的初始值推断出age是什么类型
}
constante
const PI = 3.1415926
const KB = 1024
iota
La enumeración se implementa con iota en Go
const (
n1 = iota //0
n2 //1
n3 //2
n4 //3
)
-
iota
Se restablecerá a 0 cuando aparezca la palabra clave const -
Cada nueva línea de declaración constante en const sumará
iota
una vez -
Si no hay contenido después de la constante declarada por const, será consistente con la línea anterior por defecto.
tipo de datos básicos
Cadena
Use comillas dobles para 字符串
"hola"
Use comillas simples para 字符
'h'
Métodos comunes para cadenas
entero
int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64
Int es especial, se determinará de acuerdo con la cantidad de dígitos de su sistema operativo, ya sea int32 o int64
punto flotante
flotar32 flotar64
Los números de punto flotante siempre son inexactos (¿Por qué los números de punto flotante representados por las computadoras son inexactos?)
-
Convertir a una cadena para hacer operaciones
-
Cuántas veces la ampliación general se convierte en un número entero para el cálculo
plural
complejo64 y complejo128
booleano
var a bool//默认是false
var b = true
El tipo booleano en el lenguaje Go no se puede convertir a otros tipos
byte y runa
Los caracteres ingleses se representan por byte (se puede representar el código ASCII) 01010101
runa (chino, codificación UTF8) 01010101 01010101 01010101
¿Cuándo usar la runa?
s := "hello中国"
for i:=0;i<len(s);i++{
fmt.
}
Vea el código de clase para más detalles.
control de procesos
si
age := 20
if age>18{
}else if 20 > 18 {
}else{
}
//此时age只在if语句中有效
if age:=20;age>18{
}
para
//标准for循环
for i:=0;i<10;i++{
}
//类似while循环
n := 10
for n>0 {
fmt.Println(n)
n--
}
//无限循环
for {
}
interruptor y caja
n := 10
switch n{
case 1:
...
case 2:
...
}
switch {
case n>0:
...
case n ==0:
...
}
Para compatibilidad con el código C anteriorfallthrough
Lo siguiente es para entender
ir a+etiqueta
continuar+etiqueta
romper +etiqueta
############################################## ###############
definición de matriz
¡Las matrices son de longitud y tipo de elemento! ! !
var a [3]int
var b [3]string
var c [5]int
Inicialización de matriz
var a = [3]int{
1,2,3}
var b = [...]bool{
true, false}
var c = [5]string{
1:"娜扎", 3:"小王子"}
Matrices multidimensionales
var a = [3][2]int{
{
1, 2},
{
3, 4},
{
5, 6},
}
recorrido de la matriz
- Desplazamiento según el índice índice
- para recorrido de rango
rebanada
definición de rebanada
La diferencia entre un segmento y una matriz es que no tiene una longitud fija.
Un segmento es esencialmente una matriz. Es la encapsulación de arrays a nivel de lenguaje.
Las rebanadas son tipos de referencia.
var a []int
var b []string
var c []bool
[Falló la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo anti-leeching, se recomienda guardar la imagen y cargarla directamente (img-xq27Jy9e-1678694805387)(D:\Go\src\code.oldboy.com\ estudiogolang\day03\activos\ 1555208079167.png)]
[Error en la transferencia de la imagen del enlace externo, el sitio de origen puede tener un mecanismo de enlace antirrobo, se recomienda guardar la imagen y cargarla directamente (img-CtDnfXba-1678694805388)(D:\Go\src\code.oldboy.com \studygolang\day03\activos\ 1555208177025.png)]
Valor inicial de tipo en idioma Go
tipo de valor
var a int//0
var b string//
var c float32//0
var d [3]int//[0 0 0]
var e bool//false
El tipo de referencia make() es para solicitar espacio de memoria para el tipo de referencia
var x []int//nil
inicialización de corte
- Inicializar al declarar una variable
- Los segmentos de matriz obtienen
- Rebanado y rebanado para obtener
- La función make() crea
agregar elemento de división agregar ()
append
El valor de retorno de la función debe recibirse en una variable
copiar rebanada
copiar (segmento de destino, segmento original)
Cortar elimina elementos
a = append(a[:1], a[2:]...)
mapa
definicion de mapa
map es un tipo de referencia, el valor predeterminado esnil
El mapa se usa especialmente para almacenar datos del tipo de par clave-valor
Comprobar si existe una clave
v, ok := m[key]
función
definición de función
parámetros de función
sin parámetros
Múltiples parámetros del mismo tipo pueden omitir el tipo del parámetro anterior
varargas ( ...
)
func f1(){
fmt.Println("hello 沙河!")
}
//参数类型简写
func f2(name1, name2 string){
fmt.Println(name1)
fmt.Println(name2)
}
//可变参数 0个或多个
func f3(names ...string){
fmt.Println(names)//[]string
}
valor de retorno de la función
sin valor de retorno
valor de retorno único
múltiples valores de retorno
valor de retorno nombrado
func f4(){
fmt.Println("MJJ真烦")
}
func f5(a, b int) int{
return a+b
}
//多返回值,必须用括号括起来,用英文逗号分隔
func f6(a, b int) (int, int){
return a+b, a-b
}
//命名的返回值
func f6(a, b int) (sum int, sub int){
sum = a + b
sub = a - b
return
}
Funciones y cierres anónimos
Alcance variable
1. 全局作用域
2. 函数作用域
3. 语句块作用域
aplazar
diferir la función de ejecución de retraso
defer se registra primero y luego se ejecuta (se ejecuta cuando la función está a punto de finalizar pero aún no ha finalizado)
Se utiliza principalmente para realizar algunos trabajos de recuperación de recursos.
puntero
¿Cuál es la diferencia entre un puntero y una dirección?
Dirección: Es la dirección de memoria (la dirección de memoria descrita en bytes)
Punteros: Los punteros se escriben.
&
y*
&
: Indica para buscar la dirección
*
: Tomar el valor según la dirección
nuevo y hacer
nuevo: se utiliza para inicializar punteros de tipo de valor
make: se utiliza para inicializar slice
, map
,chan
// 以下是错误的写法
// var a *int //a是一个int类型的指针
// var b *string
// var c *[3]int
// 以上是错误的写法
var a = new(int) //得到一个int类型的指针
fmt.Println(a)
*a = 10
fmt.Println(a)
fmt.Println(*a)
var c = new([3]int)
fmt.Println(c)
c[0] = 1
fmt.Println(*c)
entrar en pánico y recuperarse
pánico: excepción de tiempo de ejecución
recuperar: se utiliza para restaurar la función cuando entra en pánico y para realizar algunas operaciones de recuperación de recursos
**Nota:** Debe ser anormal para que el programa entre en pánico.
Estructura (struct) y método
type
Las palabras clave se utilizan para definir nuevos tipos en el lenguaje Go.
Tipos personalizados y alias de tipo
tipo personalizado
crear un nuevo tipo
type NewInt int
escriba el alias (enlace flexible)
var MyInt = int
byte
:uint8 y rune
:int32 son alias integrados en el lenguaje Go.
Los alias de tipo solo surten efecto durante la escritura del código y no existen después de la compilación.
Definición de estructura
//结构体
// 创在新的类型要使用type关键字
type student struct {
name string
age int
gender string
hobby []string
}
func main() {
var haojie = student{
name: "豪杰",
age: 19,
gender: "男",
hobby: []string{
"篮球", "足球", "双色球"},
}
//结构体支持.访问属性
fmt.Println(haojie)
fmt.Println(haojie.name)
fmt.Println(haojie.age)
fmt.Println(haojie.gender)
fmt.Println(haojie.hobby)
}
instanciación de la estructura
-
instanciación básica
var haojie = student{ name: "豪杰", age: 19, gender: "男", hobby: []string{ "篮球", "足球", "双色球"}, }
Inicialización de la estructura
El diseño de la memoria de la estructura.
comprensión
Los campos de la estructura son contiguos en la memoria.
func main() {
type test struct {
a int16
b int16
c int16
}
var t = test{
a: 1,
b: 2,
c: 3,
}
fmt.Println(&(t.a))
fmt.Println(&(t.b))
fmt.Println(&(t.c))
}
Constructor
func newStudent(n string, age int, g string, h []string) *student {
return &student{
name: n,
age: age,
gender: g,
hobby: h,
}
Sistema de gestión de información de estudiantes basado en funciones
obtener entrada de terminal
análisis de la demanda
// 使用函数实现一个简单的图书管理系统。
// 每本书有书名、作者、价格、上架信息,
// 用户可以在控制台添加书籍、修改书籍信息、打印所有的书籍列表。
// 0. 定义结构体
// 1. 打印菜单
// 2. 等待用户输入菜单选项
// 3. 添加书籍的函数
// 4. 修改书籍的函数
// 5. 展示书籍的函数
// 6. 退出 os.Exit(0)
interfaz
Definición de interfaz
Una interfaz es un tipo, un tipo abstracto.
Es un conjunto de especificaciones, un contrato y un montón de firmas de métodos.
type mover interface {
move()
}
implementar la interfaz
La interfaz se implementa implementando todos los métodos especificados en la interfaz.
interfaz vacía
interface{
}
Cualquier variable se puede almacenar en una variable de interfaz vacía
La diferencia entre los receptores de punteros y los receptores de valores que implementan interfaces
operación de archivo
abrir un archivo
os.Open()
os.OpenFile()
paquete de tiempo
Hora formateada: 2006-01-02 15:04:05.000
############################################## ############
simultaneidad
La diferencia entre concurrencia y paralelismo
Concurrencia: Hacer varias cosas al mismo tiempo
Paralelismo: Hacer varias cosas al mismo tiempo
proceso, hilo, corrutina
Proceso: un proceso se crea después de que se inicia un programa
Subproceso: la unidad más pequeña de programación del sistema operativo
Coroutine: subproceso en modo usuario (Python\PHP)
gorutina día 6
Go runtime runtime (algunas cosas que el autor del lenguaje Go me ayudó a hacer)
Una gorutina corresponde a una tarea (función).
Inicie la gorutina usando go
la palabra clave
sync.WaitGroup
Add(i)
: contador+i
Done()
: contador -1, lo mejor es registrarse con diferir
Wait()
:esperar
¿Cuándo termina la gorutina?
Una gorutina corresponde a una tarea (función).
La función termina (return) y la goroutine termina
La diferencia entre goroutine e hilo.
Minnesota
Programe m gorutinas para que se ejecuten en n subprocesos.
GOMAXPROCS
runtime.GOMAXPROCS(n)
canal
Los canales son tipos de referencia y deben inicializarse antes de que puedan usarse.
ch1 := make(chan int, 10)
Funcionamiento básico del canal.
enviar
tomar el control
cierre
Cuáles son las características de un canal cerrado:
Canales sin búfer y con búfer
Canal sin búfer: 4*100 barras de transferencia, también conocido como canal síncrono
Canal con búfer: permite que los programas implementen operaciones asíncronas
Determinar el canal está cerrado al tomar el valor
Método 1: ok juicio
// 利用for循环去通道ch1中接收值
for {
ret, ok := <-ch1 // 使用 value, ok := <-ch1 取值方式,当通道关闭的时候 ok = false
if !ok {
break
}
fmt.Println(ret)
}
Método 2: para bucle de rango
// 利用for range 循环去通道ch1中接收值
for ret := range ch1 {
fmt.Println(ret)
}
número aleatorio
math/rand
// 给rand加随机数种子实现每一次执行都能产生真正的随机数
rand.Seed(time.Now().UnixNano())
ret1 := rand.Int63() // int64正整数
fmt.Println(ret1)
ret2 := rand.Intn(101) // [1, 101)
fmt.Println(ret2)
seleccionar
select {
case ch1 <- 1:
...
case <- ch1:
...
case <- ch2:
...
}
canal unidireccional
// chan *item :既能接收也能发送的一个队列
// chan<- *item :只能发送的一个队列(单向通道)
// <-chan *item :只能接收的一个队列(单向通道)
Control de concurrencia y bloqueos
exclusión mutua
bloqueo de lectura y escritura
El uso de bloqueos de lectura y escritura puede mejorar el rendimiento solo cuando hay muchas más operaciones de lectura que de escritura.
sync.Once y sync.Map
############################################## ######