Go 第2章 基本语法

2021-06-07

一、变量定义

变量类型写在变量名之后

使用 var 关键字

var a, b, c bool 
var s1, s2 string="hello", "world"

使用 var() 集中定义变量

var (
    i = 00
    o = 22
)

让编译器自动决定类型

var a, b, i, sl, s2 = true, false, 3, "hello", "world"

使用 := 定义变量(只能在函数内使用)

a, b, i, s1,s2 := true, false, 3, "hello", "world"

二、内建变量类型

  • bool、string

  • (u)int、(u)int8、(u)int16、(u)int32、(u)int64:不加U表示无符号整数

  • uintptr 指针

  • byte、rune(相当于 char)

  • float32、float64、complex64、complex128:原生支持复数类型

①、复数回顾

https://file.lulublog.cn/images/3/2022/08/OnWOZwWLnPpMWkvDprd7Dl7mvdKm8A.png

https://file.lulublog.cn/images/3/2022/08/mG2uOB4JKgIXo2ziUhp9jBuKjh7JZg.png

https://file.lulublog.cn/images/3/2022/08/FEXZv4sQfZTvFzspA1sczSq1Vs1cOQ.png

②、复数例子

var d = 3 + 4i
cmplx.Abs(d)
cmplx.Pow(math.E, 1i * math.Pi)+1
cmplx.Exp(1i * math.Pi) + 1

③、强类型转换

var a, b int = 3, 4
var c int
c = int(math.Sqrt(float64(a * a + b * b)))

三、常量与枚举

3.1、常量

  • const filename="abc.txt"

  • const 数值可作为各种类型使用

  • const a,b = 3,4

  • var c int = int(math.Sqrt(a*a+b*b))

3.2、枚举

  • 普通枚举类型

const (
    a = 0
    b = 1
    c = 2
    d = 3
    e = 4
)
  • 自增枚举类型

const (
    a = iota
    _
    c
    d
    e
)
const (
    a = 1 << (10 * iota)
    b
    c
    d
    e
)

四、条件语句

4.1、if

  • if 后面的条件没有括号

  • if 的条件里可以赋值

  • if 的条件里赋值的变量作用域就在这个 if 语句里

package main
import (
    "fmt"
    "io/ioutil"
)
func main() {
    const filename = "abc.txt"
    contents, err := ioutil.ReadFile(filename)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Printf("%s\n", contents)
    }
}
package main
import (
    "fmt"
    "io/ioutil"
)
func main() {
    const filename = "abc.txt"
    if contents, err := ioutil.ReadFile(filename); err != nil {
        fmt.Println(err)
    } else {
        fmt.Printf("%s\n", contents)
    }
}

4.2、switch

  • switch 会自动 break,除非使用 fallthrough

  • switch 后可以没有表达式

package main
import (
   "fmt"
)
func main() {
   fmt.Println(
grade(0),
grade(59),
grade(60),
grade(82),
grade(99),
grade(100),
   )
}
func grade(score int) string {
   g := ""
   switch {
case score < 0 || score > 100:
   panic(fmt.Sprintf("Wrong score: %d", score))
case score < 60:
   g = "F"
case score < 80:
   g = "C"
case score < 90:
   g = "B"
case score <= 100:
   g = "A"
}
   return g
}

五、循环

  • for 的条件里不需要括号

package main
import (
    "fmt"
)
func main() {
    fmt.Println(sum())
}
func sum() int {
    sum := 0
    for i :=1; i <= 100; i++ {
        sum += i
    }
    return sum
}
  • 没有 while

  • for 的条件里可以省略初始条件(相当于 while),结束条件,递增表达式

package main
import (
    "fmt"
    "strconv"
)
func main() {
    fmt.Println(convertToBin(5))
}
func convertToBin(n int) string {
    result := ""
    for ; n > 0; n /= 2 {
        lsb := n % 2
        result = strconv.Itoa(lsb) + result
    }
    return result
}
package main
import (
    "fmt"
    "io"
    "os"
    "bufio"
)
func main() {
    printFile("abc.txt")
}
func printFile(filename string) {
    file, err := os.Open(filename)
    if err != nil {
panic(err)
    }
    printFileContents(file)
}
func printFileContents(reader io.Reader) {
    scanner := bufio.NewScanner(reader)
    for scanner.Scan() {
        fmt.Println(scanner.Text())
    }
}
  • 无限循环

package main
import (
    "fmt"
)
func main() {
    for{
       fmt.Println("abc") 
    }
}

六、函数

  • 返回值类型写在最后面

  • 可返回多个值

  • 返回多个值时可以起名字,仅用于非常简单的函数

package main
import (
    "fmt"
)
func main() {
    q,r := div(5, 2)
    fmt.Println(q, r)
}
func div(a, b int) (q, r int) {
    q = a / b
    r = a % b
    return 
}
  • 函数作为参数

package main
import (
    "fmt"
    "runtime"
    "math"
    "reflect"
)
func main() {
    fmt.Println("pow(3, 4) is:", apply(
func(a int, b int) int {
    return int(math.Pow(
float64(a), float64(b)))
    }, 3, 4))
}
func apply(op func(int, int) int, a, b int) int {
    p := reflect.ValueOf(op).Pointer()
    opName := runtime.FuncForPC(p).Name()
    fmt.Printf("Calling function %s with args "+"(%d, %d)\n", opName, a, b)
    return op(a, b)
}
  • 可变参数列表

package main
import (
    "fmt"
)
func main() {
    fmt.Println("1+2+...+5 =", sum(1, 2, 3, 4, 5))
}
func sum(numbers ...int) int {
    s := 0
    for i := range numbers {
s += numbers[i]
    }
    return s
}

七、指针

  • 指针不能运算

package main
import (
    "fmt"
)
func main() {
    var a int = 2
    var pa *int = &a
    *pa = 3
    fmt.Println(a)
}
  • Go 语言只有值传递一种方式

  • https://file.lulublog.cn/images/3/2022/08/hc06MJz2ng9c0e3Y236NwYlyl4M2vv.png

  • https://file.lulublog.cn/images/3/2022/08/j88k8u1M2b8om79mU0vB9880oZKKmo.png

  • https://file.lulublog.cn/images/3/2022/08/oV6z7vt7Ze786VED57677Jo67QRTDD.png

阅读 659