Go语言基础

2022-10-03  本文已影响0人  贝壳的世界

程序结构

变量

常量

类型

type Person struct {
    name string
    age int
}

控制语句

for

Go中唯一的循环结构

sum := 0
for i := 0; i < 10; i++ {
  sum += i
}

if-else

func sqrt(x float64) string {
    if x < 0 {
            return sqrt(-x) + "i"
    }
      return fmt.Sprint(math.Sqrt(x))
}
func pow(x, n, lim float64) float64 {
      if v := math.Pow(x, n); v < lim {
          return v
      }
      return lim
}

switch-case

    switch os := runtime.GOOS; os {
    case "darwin":
        fmt.Println("OS X.")
    case "linux":
        fmt.Println("Linux.")
    default:
        // freebsd, openbsd,
        // plan9, windows...
        fmt.Printf("%s.\n", os)
    }

defer

defer fmt.Println("world")
fmt.Println("hello")

包和文件

基础数据类型

整型

浮点型

布尔型

bool:true、false

字符串

零值

声明但未初始化的变量会被赋予零值

var i int
var b bool
var s string
fmt.Printf("%v %v %q\n", i, b, s) // 0 false ""

类型转换

表达式 T(v) 将值 v 转换为类型 T

i := 42
f := float64(i)
u := uint(f)

复合数据类型

数组

切片

哈希表

// m1 = nil
m1 := make(map[string]int)

// m2 = {}
m2 := map[string]int{}

// m3 = {"age":18}
m2 := map[string]int{
  "age": 18,
}
m[key] = elem // 新增或更新
elem = m[key] // 获取
delete(m, key) // 删除
elem, ok := m[key] // 判断键是否存在

结构体

type Employee struct {
    ID        int
    Name      string
}
e := Employee{
  ID: 123,
  Name: "test",
}
type Employee struct {
    ID        int `json:"id"`
    Name      string `json:"name"`
}

data, err := json.Marshal(e)
if err != nil {
    log.Fatalf("JSON marshaling failed: %v", err)
}
fmt.Printf("%s\n", data)

range

// 遍历数组
for index, value := range array {
    fmt.Printf("%d %d\n", index, value)
}

// 忽略index
for _, value := range array {
    fmt.Printf("%d\n", value)
}

// 忽略value
for index := range array {
    fmt.Printf("%d\n", index)
}

// 遍历哈希表
for key, value := range map {
    fmt.Printf("%d %d\n", key, value)
}

函数

声明

func name(parameter-list) (result-list) {
    body
}

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

// 如果连续参数类型相同,可以简写为:
func add(x, y int) int {
      return x + y
}

多返回值

在Go中,函数可以返回任意数量的返回值。

func swap(x, y string) (string, string) {
    return y, x
}

方法

声明

方法就是一类带特殊的接收者参数的函数。

// 方式1:值类型
func (t T) name(parameter-list) (result-list) {
    body
}

// 方式2:指针类型
func (t *T) name(parameter-list) (result-list) {
    body
}

方式1和方式2的区别:调用方法时,前者是深拷贝,后者是浅拷贝。

封装

type Counter struct { n int }
func (c *Counter) N() int     { return c.n }
func (c *Counter) Increment() { c.n++ }
func (c *Counter) Reset()     { c.n = 0 }

接口

声明

type error interface {
    Error() string
}

实现

隐式实现:一个类型拥有某接口的所有方法,则该类型就实现了这个接口。

// errorString类型
type errorString struct { 
    text string
}

// 实现error接口
func (e *errorString) Error() string {
    return e.text 
}

使用

func New(text string) error { 
    return &errorString{text}
}

空接口

func describe(i interface{}) {
      fmt.Printf("(%v, %T)\n", i, i)
}

func main() {
      var i interface{}
      describe(i) // (<nil>, <nil>)

      i = 42
      describe(i) // (42, int)

      i = "hello"
      describe(i) // (hello, string)
}

类型断言

类型选择

switch v := i.(type) {
case T:
    // v 的类型为 T
case S:
    // v 的类型为 S
default:
    // 没有匹配,v 与 i 的类型相同
}

本文由mdnice多平台发布

上一篇下一篇

猜你喜欢

热点阅读