49

Go 语言学习笔记 (01)

 5 years ago
source link: https://unifreak.github.io/note/GoLang_note_1?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

简介

参考

Go 语言特点

  • 并发
  • 新颖的类型系统
  • 垃圾回收
  • 运行时反射机制
  • 快速, 静态类型, 编译

环境搭建

  1. 下载: https://golang.org/dl/
  2. 安装
  3. sublime text 构建配置
{
    "cmd": ["go run '${file}'"],
    "selector": "source.go",
    "path": "/usr/local/go/bin",
    "shell": true
}

有趣链接

语法

定义一个包

package main // 程序从 `main` 包中开始运行

导入包

  1. 分别导入
import "fmt"
import "math"
  1. 打包 导入 (更好)
import (
    "fmt"
    "math"
)

被导出的名称 是指以大写字母开头的名称. 一个包被导入后, 只能使用其 被导出的名称

函数

参数类型在变量名之后

func add(x int, y int) int {
    return x + y
}

若多个相连参数类型相同, 可只留最后一个类型名

func add(x, y int) int {
    return x + y
}

可返回任意多个结果

func swap(x, y string) (string, string) {
    return y, x
}
// call
a, b := swap("hello", "world")

“直接(naked) 返回”: 不带参数的 return 语句

直接返回返回被命名的返回值. 应当只用在短函数中

func split(sum int) (x, y int) {
    x = sum * 4 / 9
    y = sum - x
    return
}

可以向变量一样被传递

可以是闭包: 引用函数体之外变量的函数

变量

类型

  • bool
  • string
  • int int8 int16 int32 int64
  • uint uint8 uint16 uint32 uint64 uintptr
  • byte (alias for uint8 )
  • rune (alias for int32 , represents a Unicode code point)
  • float32 float64
  • complex64 complex128

声明

package main

import "fmt"

var c, python, java bool // 包级别变量

func main() {
    var i int // 函数级别变量
    var j, k int = 1, 2 // 初始化
    f = float64(j) // 类型转换必须显式使用 `Type(var)`
    m := 3 // "简洁赋值" `:=` 只能在函数内使用
    var ( // 打包声明
        // 没有初始化的变量被赋 "零值":
        n bool // 布尔: false
        o float32 // 数字: 0
        p string // 字符串: ""
    )

    fmt.Println(i, j, k, m, n, o, p, c, python, java)
}

常量

const
:=

For 循环 (仅有的循环体)

for i := 0; i < 10; i++ { } // 没有小括号, 必须有花括号

// 前置和后置语句可为空
for ; i < 10; { }

// 再去掉分号, 实际上就是 go 中的 while 语句了
for i < 10 { }

// 无限循环...
for { }

If else

if x < 0 { } // 同 `for`, 没有小括号, 花括号必须

if v := math.Pow(x, n); v < lim { // 可在条件之前执行一个短语句

} else { // v 在 `else` 中仍可见
    fmt.Printf("%g >= %g\n", v, lim)
}

Switch

// 除非 `fallthrough`, 每个 case 会自动 break
switch os := runtime.GOOS; os {
case "darwin":
    fmt.Println("OS X.")
case "linux":
    fmt.Println("Linux.")
default:
    fmt.Printf("%s.\n", os)
}

// 使用不带条件的 switch 可以更简洁的串联 if-then-else
t := time.Now()
switch {
case t.Hour() < 12:
    fmt.Println("Good morning!")
case t.Hour() < 17:
    fmt.Println("Good afternoon.")
default:
    fmt.Println("Good evening.")
}

Defer

defer
defer
fmt.Println("counting")

for i := 0; i < 10; i++ {
    defer fmt.Println(i)
}

fmt.Println("done")

指针

  • 像 C:
    • 使用 * 声明: var p *int
    • 使用 & 取地址: p = &i
    • 使用 * 间接引用: *p = 21
  • 不像 C: 没有指针运算

结构体: 字段集合

// 声明
type Vertex struct {
    X int
    Y int
}

// 初始化: 使用 {}
var (
    v = Vertex{1, 2}  // 1. 列出字段值
    w = Vertex{X: 1}  // 2. 使用 `Name:` 语法, 顺序无关
)

// 引用: 使用点号
p := &v
v.X = 4
p.Y = 5 // 即使指针也能直接用点号, 同 `(*p).Y`
fmt.Println(v.X)

数组

  • 定长, 不能改变长度
// 声明
var a [2]string // [n]T
primes := [6]int{2, 3, 5, 7, 11, 13} // {}

// 引用: []
a[0] = "Hello"

Slice

nil
// 声明

// 1. 从数组: []T = [low:high], 包含 low, 不包含 high
primes := [6]int{2, 3, 5, 7, 11, 13}
var a []int = primes[1:4]

// 2. 从其他 slice: low 默认为 0, high 默认为长度
c =  a[:2]

// 3. 使用字面量: []T, 会新建一个数组并从其构建 slice
d := []int{2, 3, 5, 7, 11, 13}
e := []struct {
    i int
    b bool
}{
    {2, true},
    {3, false},
}
f := [][]string{ // 可嵌套其他 slice
    []string{"_", "_", "_"},
    []string{"_", "_", "_"},
    []string{"_", "_", "_"},
}

// 4. 使用 `make`
g := make([]int, 3, 5) // 创建一个长度为 3 (0 值) 且容量为 5 的 []int 型 slice


// 长度 & 容量
len(a)
cap(a)

// 添加元素: 如果低层数组太小, 会自动创建并指向新数组
a = append(a, 1)

// 迭代
for i, v := range a {} // `range` 在每次迭代中返回一个索引和一个值
for _, v := range a {} // 使用 _ 忽略索引
for i, _ := range a {} // 使用 _ 忽略值, 等同于
for i := range a {}    // 此

Maps

  • 零值: nil
type Vertex struct {
    Lat, Long float64
}

// 声明
var m map[string]Vertex
// 1. 使用 `make`
m = make(map[string]Vertex)

// 2. 使用字面量
var n = map[string]Vertex{
    "Bell Labs": Vertex{40.68433, -74.39967, },
    "Google": Vertex{37.42202, -122.08408, }, // type name `Vertex` can be omitted
}

// CURD
m["Bell Labs"] = Vertex{40.68433, -74.39967,} // 修改
v, ok := m["Bell Labs"] // 引用: v 是值, ok 是否元素在 map 中
delete(m, "BEll Labs") // 删除

Recommend

  • 55

  • 50
    • blog.einverne.info 5 years ago
    • Cache

    Go 语言学习笔记 3:基础类型

    和大多数强类型语言一样,Go 也有自己基本的类型系统。Go 语言的类型大致可以分为四大类: basic types aggregate types reference types interface types 基础类...

  • 28
    • studygolang.com 5 years ago
    • Cache

    Go语言学习笔记(六)

    golang中结构体是由零个或多个任意类型的值组成的实体。一般在 golang 中用结构体来定义某个类。 基本使用 例如声明一个 Employee 的结构体: type Employee struct { Id int Name...

  • 58
    • studygolang.com 5 years ago
    • Cache

    Go语言学习笔记(七)之方法

    在面对对象编程(OOP),我们常把某个对象实现的具体行为的函数称作方法。例如 C++中A类的某个函数实现了某种行为,我们就叫做 A 的方法。在 golang 中如果要定义一个方法,只需要在函数声明时,在函数名前加上某个变量,即该变量实现了某个...

  • 47
    • www.tuicool.com 4 years ago
    • Cache

    并发 - Go 语言学习笔记

    并发 (concurrency) 是指同时管理很多事情,这些事情可能只做了一半就被暂停去做别的事情了。 Go 语言里的并发指的是能让某个函数独立于其它函数运行的能力。当一个函数创建为 goroutine 时,Go 会将其视为一个独立的工作单元。这...

  • 28
    • www.tuicool.com 4 years ago
    • Cache

    通道 - Go 语言学习笔记

    在 Go 语言里,你不仅可以使用原子函数和互斥锁来保证对共享资源的安全访问以及消除竞争状态,还可以使用通道,通过发送和接收需要共享的资源,在 goroutine 之间做同步。 如果说goroutine是Go并发的执行体,那么“通道”就是他们之...

  • 43
    • www.tuicool.com 4 years ago
    • Cache

    反射 - Go 语言学习笔记

    在计算机科学中,反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。用比喻来说,反射就是程序在运行的时候能够“观察”并且修改自己的行为。 什么是 Go 的反射 Go 语言提供了一种...

  • 24

    转载原文: https://blog.csdn.net/cbmljs/article/details/82983639 这里有一些关于unsafe.Pointer和ui...

  • 38
    • studygolang.com 4 years ago
    • Cache

    GO语言学习笔记6-Sort的使用

    GoLang标准库的sort包提供了排序切片和用户自定义数据集以及相关功能的函数。 Sort操作的对象通常是一个slice,需要满足三个基本的接口,并且能够使用整数来索引。 1.sort实现原理 Sort排序的函数原型如下所示:...

  • 24

    Go 语言学习笔记 -第2章 [toc] 程序结构 名称 首字母大写的一般是public方法,首字母小写不能直接调用 使用驼峰式的风格 声明 每一个文件都是以package声明开头,表明...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK