hincky的主页 hincky的主页
  • 学习笔记

    • Vue笔记
    • Vuepress
    • nginx
  • 语言类

    • java
    • go
    • python
    • 设计模式
  • 框架类

    • Spring
    • Spring Security
    • Mybatis
  • 容器技术

    • docker
    • k8s
    • helm
    • prometheus
    • grafana
    • jenkins
  • 命令集合

    • linux命令
    • docker命令
    • git命令
    • vim命令
    • k8s命令
  • 数据库

    • sql
    • mysql
  • 协议

    • 网络模型
    • http/1.1
    • WebSocket
    • http/2
    • TLS/SSL
    • tcp
    • IP
    • tcpdump抓包命令
    • wireshark抓包工具
  • 通用

    • Git
  • 技术分享

    • git push/pull总是超时怎么办
    • idea debug技巧
    • postman使用
    • 问题总结
    • idea使用技巧
  • Oauth2

    • Oauth2原理
  • 项目列表

    • redis项目
    • 微服务项目
  • 分类
  • 标签
  • 归档
  • 随笔
GitHub (opens new window)

Hincky

当有趣的人,做想做的事
  • 学习笔记

    • Vue笔记
    • Vuepress
    • nginx
  • 语言类

    • java
    • go
    • python
    • 设计模式
  • 框架类

    • Spring
    • Spring Security
    • Mybatis
  • 容器技术

    • docker
    • k8s
    • helm
    • prometheus
    • grafana
    • jenkins
  • 命令集合

    • linux命令
    • docker命令
    • git命令
    • vim命令
    • k8s命令
  • 数据库

    • sql
    • mysql
  • 协议

    • 网络模型
    • http/1.1
    • WebSocket
    • http/2
    • TLS/SSL
    • tcp
    • IP
    • tcpdump抓包命令
    • wireshark抓包工具
  • 通用

    • Git
  • 技术分享

    • git push/pull总是超时怎么办
    • idea debug技巧
    • postman使用
    • 问题总结
    • idea使用技巧
  • Oauth2

    • Oauth2原理
  • 项目列表

    • redis项目
    • 微服务项目
  • 分类
  • 标签
  • 归档
  • 随笔
GitHub (opens new window)
  • java

  • python

  • Spring

  • SpringMVC

  • SpringSecurity

  • Mybatis

  • 设计模式

  • Go

    • 基础语法

      • 环境安装
        • 你好,Go语言
        • 环境安装
        • 目录结构
        • 命令
        • 开发工具
        • 学习网址
      • 变量声明
        • 概述
        • 数据类型
          • 字符串
          • 布尔
          • 数字
        • 常量声明
        • 变量声明
        • 输出方法
      • 数组
        • 概述
        • 声明数组
        • 注意事项
      • Slice 切片
        • 概述
        • 声明切片
        • 截取切片
        • 追加切片
        • 删除切片
      • Struct 结构体
        • 概述
        • 声明结构体
        • 生成 JSON
        • 改变数据
      • Map 集合
        • 概述
        • 声明 Map
        • 生成 JSON
        • 编辑和删除
      • 循环
        • 概述
        • 循环 array
        • 循环 slice
        • 循环 map
        • break
        • continue
        • goto
        • switch
      • 函数
        • 概述
        • 函数定义
        • 值传递
        • 引用传递
        • MD5
        • 获取当前时间字符串
        • 获取当前时间戳
        • 生成签名
      • chan 通道
        • 概述
        • 声明 chan
        • 写入 chan
        • 读取 chan
        • 关闭 chan
        • 示例
      • defer 函数
        • 概述
        • 执行顺序
        • 闭包
        • Return
          • 一
          • 二
          • 三
          • 四
        • os.Exit
        • 不同协程
        • 答案解析
        • go-gin-api 系列文章
      • 解析 JSON 数据
        • 概述
        • JSON 结构
        • go-gin-api 系列文章
      • Unmarshal 遇到的小坑
        • 1.问题现象描述
        • 2.问题影响描述
        • 3.引起问题的原因
        • 4.问题的解决方案
      • 结构(struct) 实现 接口(interface)
        • 代码示例
        • 代码解释
          • 一、
          • 二、
          • 三、
      • Dial(target string, opts …DialOption) 的写法
        • 一
        • 二
        • 场景
        • 代码实现
        • 输出
      • RFC3339 时间格式化
        • 运行一下
        • 小结
      • 常用签名算法的基准测试
        • MD5 单向散列加密
        • AES 对称加密
        • RSA 非对称加密
        • 最后
      • 分享两个在开发中需注意的小点
        • 不要使用 + 和 fmt.Sprintf 操作字符串
          • +
          • fmt.Sprintf
          • bytes.NewBufferString
        • 对于固定字段的键值对,不要使用 map[string]interface{}
          • map[string]interface{}
          • 临时 Struct
        • 小结
          • 推荐阅读
      • Pool 来减少 GC 压力
        • 前言
        • sync.Pool
        • 小结
        • 推荐阅读
      • 基于逃逸分析来提升程序性能
        • 前言
        • 什么是逃逸分析?
        • 如何确定是否逃逸?
        • 可能出现逃逸的场景
          • 01
          • 02
          • 03
        • 小结
        • 推荐阅读
      • Map 来解决 map 的并发操作问题
        • 前言
        • map 并发操作出现问题
        • sync.Map 解决并发操作问题
        • 计算 map 长度
        • 计算 sync.Map 长度
        • 小结
        • 推荐阅读
      • WaitGroup 来实现并发操作
        • 前言
        • sync.WaitGroup 正确使用
        • sync.WaitGroup 闭坑指南
          • 01
          • 02
          • 03
        • 小结
        • 推荐阅读
    • Gin框架

    • Go gRPC

    • go-gin-api [文档]

    • go基本介绍
      • 安装go
      • hello world
      • 变量类型
      • 变量和声明
        • 定义和赋值分开
        • 定义和赋值合并
        • 最简单的写法
        • 最简写法结合函数
        • 多个变量同时赋值
        • 变量总结
      • if
      • 导入包
      • 运行go代码
      • 函数声明
        • 返回值个数
        • 参数接收
        • 两个参数都接收
        • 只接收其中一个参数
    • Go结构体
      • 定义结构体
      • 声明和初始化
        • 结构体字段
        • 结构体初始化
        • 函数参数传递方式
        • 镜像复制
        • 指针
      • 结构体上的函数
      • 构造器
        • new
    • Go相关项目推荐
      • 收录golang的一些好的开源项目
  • 后端
  • Go
hincky
2022-11-14
目录

go基本介绍

# 安装go

官网下载地址 (opens new window)

选择所需版本,windows下载msi安装包

选择自定义的安装路径

# hello world

package main  //包声明,指明这个文件属于哪个包
import "fmt"  //引入包,其实就是告诉Go 编译器这个程序需要使用的包
func main() { //
	// 终端输出hello world
	fmt.Println("Hello world!")
}
1
2
3
4
5
6

# 变量类型

格式:var var_name 类型

变量:Go 语言变量名由字母、数字、下划线组成,其中首个字符不能为数字。

数据类型的出现是为了把数据分成所需内存大小不同的数据:

类型 详解
boolean 布尔型的值只可以是常量 true 或者 false。
int,float Go 语言支持整型和浮点型数字,并且支持复数,其中位的运算采用补码。
string 由单个字节连接起来的。Go 语言的字符串的字节使用 UTF-8 编码标识 Unicode 文本。
派生类型 (a) 指针类型(Pointer)(b) 数组类型© 结构化类型(struct)(d) Channel 类型(e) 函数类型(f) 切片类型(g) 接口类型(interface)(h) Map 类型

# 变量和声明

# 定义和赋值分开

先说最复杂的

package main

import (
  "fmt"
)

func main() {
  var power int //定义了一个int类型的变量power,并自动分配默认值即 0
  power = 9000
  fmt.Printf("It's over %d\n", power)
}
1
2
3
4
5
6
7
8
9
10
11

# 定义和赋值合并

var power int = 9000
1

# 最简单的写法

提示

对于局部变量 Go会自动推断变量的类型

power := 9000
1

警告

不能用于全局变量 而且同一个变量,在相同作用域下,不能被声明两次 否则会报错 := 左侧不是新的变量

# 最简写法结合函数

函数的返回结果赋值给变量

func main() {
  power := getPower()
}

func getPower() int {
  return 9001
}
1
2
3
4
5
6
7

# 多个变量同时赋值

func main() {
  name, power := "Goku", 9000
  fmt.Printf("%s's power is over %d\n", name, power)
}
1
2
3
4

提示

多个变量赋值的时候,只要其中有一个变量是新的,就可以使用:=

比如下面的name是新变量,就可以用:=

func main() {
  power := 1000
  fmt.Printf("default power is %d\n", power)

  name, power := "Goku", 9000
  fmt.Printf("%s's power is over %d\n", name, power)
}
1
2
3
4
5
6
7

警告

在Go中,不允许你在程序中拥有未使用的变量和包,比如下面代码编译会不通过

func main() {
  name, power := "Goku", 1000
  fmt.Printf("default power is %d\n", power)
}
1
2
3
4

# 变量总结

  1. 初始化一个变量时,用:var NAME TYPE
  2. 给变量声明及赋值时,用: NAME := VALUE
  3. 给之前已经声明过的变量赋值时,用: NAME = VALUE

# if

if name == "Leto" {
  print("the spice must flow")
}

if (name == "Goku" && power > 9000) || (name == "gohan" && power < 4000)  {
  print("super Saiyan")
}
1
2
3
4
5
6
7

# 导入包

import{
  "fmt"
  "os"
}
1
2
3
4

警告

导入包之后,不使用就会报错

# 运行go代码

go run hello.go
1
  1. go run命令已经包含了编译和运行。

它使用一个临时目录来构建程序,执行完然后清理掉临时目录。你可以执行以下命令来查看临时文件的位置:

go run --work hello.go
1
  1. 编译代码
go build hello.go
1

# 函数声明

# 返回值个数

  1. 没有返回值
  2. 一个返回值
  3. 两个返回值
func log(message string) {
}

func add(a int, b int) int {
}

func power(name string) (int, bool) {
}
1
2
3
4
5
6
7
8

# 参数接收

# 两个参数都接收

func power(name string) (int, bool) {
    value, exists := power("goku")
    if exists == false {
        // 处理错误情况
    }
}
1
2
3
4
5
6

# 只接收其中一个参数

func power(name string) (int, bool) {
    _, exists := power("goku")
    if exists == false {
        // 处理错误情况
    }
}
1
2
3
4
5
6
编辑 (opens new window)
#Go
路由中间件 - 签名验证
Go结构体

← 路由中间件 - 签名验证 Go结构体→

最近更新
01
人生前期重要的能力
05-17
02
防火墙命令
04-11
03
docker-compose部署mysql主从集群
03-22
更多文章>
Theme by Vdoing | Copyright © 2022-2023 Hincky | MIT License | 粤ICP备2022120427号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式