Resumen de los conceptos básicos de go

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+Py en la plataforma Mac. Command+Shift+PEn 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 Windowsestá 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 Windowsestá utilizando PowerShelluna 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
	)
  • iotaSe restablecerá a 0 cuando aparezca la palabra clave const

  • Cada nueva línea de declaración constante en const sumará iotauna 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
	)
  • iotaSe restablecerá a 0 cuando aparezca la palabra clave const

  • Cada nueva línea de declaración constante en const sumará iotauna 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

  1. Desplazamiento según el índice índice
  2. 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

  1. Inicializar al declarar una variable
  2. Los segmentos de matriz obtienen
  3. Rebanado y rebanado para obtener
  4. La función make() crea

agregar elemento de división agregar ()

appendEl 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

typeLas 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

  1. 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

serie fmt.Scan

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 gola 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

############################################## ######

Supongo que te gusta

Origin blog.csdn.net/qq_44912603/article/details/129496784
Recomendado
Clasificación