go语言上手 | 青训营笔记

96 阅读3分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记

如何编写golang代码

代码组织

go应用使用包和模块来组织代码,包对应文件系统就是文件夹,模块就是.go的go源文件。一个包中会有多个模块,或者多个子包。

go项目管理工具

早期用gopath管理项目,不方便而且容易出错。现在用gomod或者一些第三方模块

实现步骤

  1. 创建项目
  2. 初始化项目
  3. 创建包
  4. 创建模块
  5. 相互调用

golang标识符,关键字,命名规则

标识符

给 变量 常量 函数 方法 结构体 数组 切片 接口起名的字

标识符的组成

  1. 标识符有数字 字母 下划线 组成
  2. 只能以字母 下划线开头
  3. 区分大小写

golang变量

声明之后必须使用

var identifier type

var:声明变量的关键词

identifier:变量的名称

type:变量的状态

func main() {
    var name string
    fmt.Printf("name: %v\n", name)
​
    var(
        age int
        married bool
    )
​
    age = 120
    married = true
    fmt.Printf("age: %v\n", age)
    fmt.Printf("married: %v\n", married)
​
}

变量的初始化:

func main() {
​
    var name string ="老张"
    var site string ="www.qq.com"
    var age int = 20
​
}

类型的判断

func main() {
​
    //类型的推断
    var name="tom"
    var age=20
    var b = true
    
    fmt.Printf("name: %v\n", name)
    fmt.Printf("age: %v\n", age)
    fmt.Printf("b: %v\n", b)
​
}

初始化多个变量

func main() {
​
    var name,site,age = "老张" ,"www.qq.com",30
    fmt.Printf("name: %v\n", name)
    fmt.Printf("site: %v\n", site)
    fmt.Printf("age: %v\n", age)
​
}
func main() {
​
    //短变量申明
    name:= "tom"
    age:="20"
    b:=true
​
    fmt.Printf("name: %v\n", name)
    fmt.Printf("age: %v\n", age)
    fmt.Printf("b: %v\n", b)
​
}

匿名变量:

func getNameAndAge()(string,int){
    return "tom",20
}
​
​
func main() {
​
    name,age :=getNameAndAge()
    fmt.Printf("name: %v\n", name)
    fmt.Printf("age: %v\n", age)
​
}

go语言的常量

编译阶段确定,程序运行是无法改变该值

const constantName [type] = value

实例:

    const PI float64 =3.14
    const PI2 = 3.1415
    fmt.Printf("PI: %v\n", PI)
​
    const(
        a = 100
        b = 200
    )
​
    const w,h =200,300

iota

iota比较特殊,可以被认为是一个可被编译器修改的常量,默认值是0,每调用一次加一。遇到const关键字是被重置为0

实例:

func main() {
​
    const (
        a1 = iota  //0
        a2 = iota  //1
        a3 = iota  //2
    )
​
    fmt.Printf("a1: %v\n", a1)
    fmt.Printf("a2: %v\n", a2)
    fmt.Printf("a3: %v\n", a3)
​
}
​

跳过:

func main() {
    const (
        a1 = iota  //0
        _  //1
        a3 = iota  //2
    )
}

中间插队的情况:

func main() {
​
    const (
        a1 = iota  //0
        a2 = 100
        a3 = iota  //2
    )
​
​
}

函数的使用

func add2(n int){
    n+=2     //无法修改成功   传入的是一个拷贝
}
​
func add2ptr(n *int){
    *n+=2       //需要用指针传
}
​
​
func main() {
    n:=5
    add2(n)
    fmt.Println(n)
    add2ptr(&n)
    fmt.Println(n)
}

结构体的使用

type user struct {
    name     string
    password string
}
​
func main() {
    a := user{name: "zhang", password: "123456"}
    b := user{name: "zhangzheng", password: "123456"}
    c := user{name: "jisoo"}
    c.password = "123456" //依然可以用变量.属性的格式 对变量进行复制和使用var d user
    d.name = "zhangzheng"
    d.password = "123456"
​
    fmt.Println(a, b, c, d)
    fmt.Println(checkPassword(a,"123456"))
    fmt.Println(checkPassword2(&a,"123456"))
    fmt.Println()
​
​
    d.resetPassword("zhagnzhegn")
    fmt.Printf("d: %v\n", d)
​
}
​
​
​
func checkPassword(u user,password string)bool{
    return u.password==password
}
​
func checkPassword2(u *user,password string) bool {     //传入指针可以对属性进行修改 而且避免了大结构体的拷贝
    return u.password==password
}
​
​
//结构体的方法  类似于类成员函数
func (u user) checkPassword3(password string) bool{
    return u.password==password
}
​
func (u *user) resetPassword(password string){
    u.password=password
}