Go 语言笔记

Go 语言笔记

安装

https://go.dev/dl/

# go version 查看Go版本

C:\Users\Administrator>go version
go version go1.21.5 windows/amd64

配置环境变量

Linux :

sudo vim /etc/profile

export GOROOT=/opt/go
export PATH=$PATH:$GOROOT/bin
export GOPATH=/home/d5v/GoWorke

新建初始目录

mkdir $GOPATH/src
mkdir $GOPATH/pkg
mkdir $GOPATH/bin

第一个程序

package main

import "fmt"

func main() {
    fmt.Print("hello world")
}
  • package main 软件包 main包是Go的入口 main包 包含一个 main函数 作为入口函数

  • import "fmt" 导入系统输入输出的模块

注释

  • 使用 // 开头

  • 或者使用 /* */

和 C 一样

// 单行只是

/*
多行注释
*/

变量

使用 var 关键词定义变量

var name string = "dbp"
var age int = 18
var 名字 string = "包皮哥"
var __年龄__ = int = 18
// 以上是正确的命名方法 可以使用中文

同时定义多个值

var (
    name2           string
    age2            int
    addr            string
    password        int    = 1
    username, email string = "None", "None"
)

可以给初始值也可以不给 但是类型是必须的

hhhh := "自动推导类型"
var (
  hhh = "感觉不如直接var 可以不用:= 也能推导"
)

交换变量

println(age, &age, age2, &age2)
age, age2 = age2, age
println(age, &age, age2, &age2) 

匿名变量

var _, a = f1(1, 2)
// _ 的值会被删除 并可以重复定义

作用域

定义在文件内 func 外的变量叫做全局变量 可以不调用 不会报错

定义在 func 内的变量叫做局部变量 只能在本函数内被调用

var globalName = "global"

func main() {
  var localName = "local"
  ...
}

在调用时 如果局部变量含有想用名称的变量 覆盖全局变量 局部优先级高于全局变量

常量

定义之后 不可改变的量 被称为常量

  • 常量不使用不会报错

  • 常量不能没有初始值

const URL string = "www.baidu.com"
const URL2 string = "fanyi.baidu.com"

const (
    URL3       string = "hello"
    URL4       string = "hello4"
    URL5, URL6        = "nmsl", "cnm"
)

特殊常量 iota

iota是一个常量计数器

const (
  c = iota // 0
  b = iota // 1
  a        // 2         不写赋值 自动跟随上一个值
  d = "hello" // hello
  e           // hello
  f = iota // 5         就算一个 const() 中的变量 不等于 iota 也会计数
  g        // 6
)

数据类型

布尔类型 bool true false 两个值

整形

  • uint 无负数整数 无符号整数

  • uint8 uint16 uint32 uint64.

  • int int8 int16 int32 int64

  • byte = uint8

  • rune = int32

浮点数

  • float32 float64

字符串

  • string

运算符

& 取内存地址

// 取地址符号 &
fmt.Printf("value: [%d], memory of: [%p]\n", age, &age)
age = 200
fmt.Printf("value: [%d], memory of: [%p]\n", age, &age)

* 根据内存地址取值

var i1 int = 10
var address *int = &i1
println(*address)
> 10

算数运算

  • + - * / %

  • i++ 自增

  • i-- 自减

关系运算符

  • ==

  • >

  • <

逻辑运算符

  • &&

  • ||

  • !

函数

定义

// 普通函数
func test1() (a int, b int) {
    return 1, 2
}

func 函数名(参数列表) (返回值列表) {
  代码块
  return 返回值列表
}

// 局部函数
var i = func() (a int, b int) {
    return 1, 2
}

i := func() (int, int) {
  return 1, 2
}

var 函数名 = func(参数列表) (返回值列表) {
  代码块
  return 返回值列表
}

// 匿名函数
func (a, b) {
代码块
}(a, b)

// 接受多个或单个参数
a := func1()
_ := func1()  // 不需要返回参数

_, err := func1()
value, err := func1()

Println() Print()

参数:

  • *args

fmt.Println("hello world", "!")
fmt.Println("hello world" + "!")
var (
  a = "hello"
  b = "world"
)
fmt.Println(a, b)
// 高版本好像可以直接print 不用导入 fmt
print("hello world\n")
println("hello", "world")
fmt.Println("hello", "world"+"!")
fmt.Printf("%s", "hello world")

printf 的标识符:

  • %T 类型

  • %t

  • %f 浮点数 变种 %.2f 保留两位小数

  • %d 整数

  • %lffloat64 双精度浮点

  • %s 字符串

  • %c char

  • %v 所有类型

append()

// append 函数用于给切片、类型拓展一个值
books = []string

books = append(books, "hello")

流程控制

if

if 条件 {}
else if 条件 {}
else {}

if 条件 {
  if 条件 {
  } else {}
}

switch

switch 变量 {
  case 匹配值:
    代码块
  case 匹配值1, 匹配值2:
    代码块
    break // 跳出
  default:
    匹配不到执行的代码块
  fallthrough // 穿透
}

select

// 同时监控多个管道

select {
  case x := <- c1: // 如果管道可读
    x 代码块
  case <- c1:  // 可读但不要值
    代码块
  case c1 <- x: // 如果管道可写
  default:
    默认代码块
}

for

for i := 1; i <= 100; i++ {
  ...
}

for 定义变量;循环条件;每次循环后执行 {
  代码块
}

for ; 条件 ; 每次循环后执行 {
  代码块
}

for ;; 每次循环后执行 {
  无限循环 代码块
}

for ; 条件 ; {
  代码块
}

for {
  无限循环 代码块
}

// 迭代map
for index, value := range books {
  代码块
}
LICENSED UNDER CC BY-NC-SA 4.0
Comment