GO语言基础1| 青训营笔记

111 阅读7分钟

00准备:

配置环境变量,选择开发工具(我选择的是vscode)

1命名规范

Go是一门区分大小写的语言。

1.1包命名

持package的名字和目录保持一致,和标准库不要冲 突。包名应该为小写单词。

package main

1.2文件命名

小写单词,使用下划线分隔各个单词。

approve_service.go

1.3结构体命名

驼峰命名法,首字母根据访问控制大写或者小写。申明和初始化格式采用多行。

type Point struct {
    X int
    Y int
}
type Color struct {
    R,G,B byte
}

1.4接口命名

函数的结构名以 “er” 作为后缀

type Reader interface {
    Read(p []byte) (n int, err error)
}

1.5变量命名

一般遵循驼峰法,首字母根据访问控制原则大写或者小写。 注意有以下规则:

  1. 变量为私有,且特有名词为首个单词,则使用小写,如 appService
  2. 变量类型为 bool 类型,则名称应以 Has, Is, Can 或 Allow 开头
var str string
var isExist bool

1.6常量命名

常量均需使用全部大写字母组成,并使用下划线分词

const APP_URL = "https://www.baidu.com"

是枚举类型的常量,需要先创建相应类型:

const (
    Unknown = 0
    Female = 1
    Male = 2
)
type Scheme string 
const ( 
    HTTP Scheme = "http" 
    HTTPS Scheme = "https" 
)

01基础数据类型

  • 布尔类型: 布尔型的值只可以是常量 true 或者 false。不可以像C那样用0和非0代替
  • 数字类型: 整型和浮点型,支持复数
  • 字符串类型: 字符串是由单个字 节连接起来的。和C类似,但是Go的字符串并没有以'\0' 结尾

1布尔类型

两个类型相同的值可以使用相等 == 或者不等 != 运算符来进行比较并获得一个布尔型的值。
注意:

  1. 只有在两个的值的类型相同的情况下才可以使用。
  2. 默认值为false。
  3. 不允许将整型强制转换为布尔型,就意味着不可用0,非0代替真假

2数字类型

2.1整数

int、uint 和 uintptr。
uint8 无符号 8 位整型 (0 到 255) int8 有符号 8 位整型 (-128 到 127)。有uint16,uint32,uint64等

2.2浮点

float32 IEEE-754 32位浮点型数, float64 IEEE-754 64位浮点型数
浮点数字面量会被自动推断为 float64。

2.3复数

包括两种,complex64 32 位实数和虚数,complex128 64 位实数和虚数。

  1. complex:构造一个复数。
  2. real:获取复数的实部。
  3. imag:获取复数的虚部。
c = complex(re, im)

函数 real(c) 和 imag(c) 可以分别获得相应的实数和虚数部分。

2.4其他

byte 类似 uint8;rune 类似 int32;uint 32 或 64 位;int 与 uint 一样大小;uintptr 无符号整型,用于存放一个指针。

3字符串类型

字符串是 UTF-8 字符的一个序列。字符串是一种值类型,且值不可变,即创建某个文本后你无法再次修改这个文本的内容;更深入地讲, 字符串是字节的定长数组。 是一个任意字节的常量序列。[] byte类型字节数组
字符串字面量使用双引号 "" 或者反引号 ' 来创建。双引号用来创建可解析的字符串, 支持转义,但不能用来引用多行;反引号用来创建原生的字符串字面量,可能由多行组成,但不支持转义,并且可以包含除了反引号外其他所有字符。

3.1字符串切片截取:

以通过标准索引法来获取,在中括号 [] 内写入索引,索引从 0 开始计数。
注意:

  1. 获取字符串中某个字节的地址的行为是非法的,例如: &str[i]。
  2. 可以用==和<进行比较;比较通过逐个字节比较完成的。
  3. 字符串的值是不可变的,可以给一个字符串变量分配一个新字符串值。尝试修改字符串内部数据的操作也是被禁止。

3.2字符串拼接+

两个字符串 s1 和 s2 可以通过 s := s1 + s2 拼接在一起。
拼接的简写形式 += 也可以用于字符串。

02变量与常量声明赋值

在命名方面参考00章节里的命名规则

1变量

1.1一般形式:

var identifier type = expression
一次声明多个的时候:
var identifier1, identifier2 type = expression1, expression2
和C系不同,类型是跟在变量名后面的。
类型和表达式可以省略一个,但不能都省略。可以自行推断,默认初始化值为对应类型的零值,数字是 0,布尔值是 false,字符串是 "",接口和引用(slice,指针,map,通道,函数)是 nil,对于数组或结构体这样的复合类型,零值是其所有元素或成员的零值

1.2短变量声明

在函数内部,可以使用更简略的:=方式声明并初始化变量。注意只能函数内部,外部不可以使用
name := xlin
多个变量:

num, str := 5"alwaysbeta"

多个变量声明时,最少有一个新变量,否则会报错。

var i int  
// i := 100 // 报错
i, j := 100101 // 有新值 j,不报错

1.3匿名变量

如果想要忽略某个值,可以使用匿名变量(anonymous variable)。 匿名变量用一个下划线_表示,就是不使用这个变量,忽略这个变量,下划线表示变量名称。
匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明。

func getInfo() (string, int) { 
    return "xlin", 2023 } 
func main() { 
    name, _ := getInfo()
    _, age := getInfo() 
}

1.4变量赋值 =

var m, n int  
m = 9  
n = 10  
m, n = n, m

最后一行, m,n 的值进行互换

1.5注意

函数外的每个语句都必须以关键字开始(var、const、func等)
:=不能使用在函数外。
_多用于占位,表示忽略值。

2常量

在程序运行时,不会被修改的量。

2.1一般形式

const identifier [type]= value
你可以省略类型说明符 [type]
显式类型定义: const b string = "abc"
隐式类型定义: const b = "abc"
多个相同类型的声明可以简写为:
const c_name1, c_name2 = value1, value2
常量的值必须是能够在编译时就能够确定的,在编译期间自定义函数均属于未知,因此无法用于常量的赋值,但内置函数可以使用,如:len()
数字型的常量是没有大小和符号的,并且可以使用任何精度而不会导致溢出。

const Ln2= 0.693147180559945309417232121458\  
           176568075500134360255254120680009

反斜杠 \ 可以在常量表达式中作为多行的连接符使用。
常量也允许使用并行赋值的形式:

const beef, two, c = "eat", 2, "veg" 
const Monday, Tuesday, Wednesday = 1, 2, 3
const ( 
    Monday, Tuesday = 1, 2 
    Saturday = 6 
)

定义多个常量时,如果省略了值,则和第一个值相同

const ( 
    A = 10 
    B 
) 
//A=10,B=10

常量还可以用作枚举:

const ( 
    Unknown = 0 
    Female = 1 
    Male = 2 
)

数字 0、1 和 2 分别代表未知性别、女性和男性。这些枚举值可以用于测试某个变量或常量的实际值。

2.2iota

iota是go语言的常量计数器,只能在常量的表达式中使用。iotaconst关键字出现时将被重置为0。const 中每新增一行常量声明将使iota计数一次。
第一个iota等于0,每当iota在新的一行被使用时,它的值都会自动加1。

const ( 
    a = iota //0 
    b        //1 
    c        //2 
)

iota 在每个 const 开头被重置为 0。

const x = iota // 0  
const y = iota // 0

多个 iota 定义在一行

const ( 
    a, b = iota + 1, iota + 2 //1,2 
    c, d //2,3 
    e, f //3,4 
)

使用下划线_跳过某些值

const ( 
    a = iota //0 
    _ = iota //1 丢弃该值,常用在错误处理中 
    c = iota //2 
)