go 基础知识

2023年 7月 14日 73.9k 0

应用入口

  • 必须是 main 包:package main
  • 必须是 main 方法:func main()
  • 文件名不一定是 main.go
  • 应用入口返回值

    运行 go run main.go 会输出 exit status 255

    func main() {
      os.Exit(-1)
    }
    

    不能使用 return 的形式

    // 错误
    func main() {
      return -1
    }
    

    获取命令行参数

    通过 os.Args 获取命令行参数

    func main() {
      fmt.Println(os.Args)
    }
    

    main 函数不支持传入参数

    // 错误
    func main(arg []string){}
    

    变量声明

  • var a int = 1
  • var b, c int = 1, 2
  • 可以换行
    var (
      d int = 1
      e int = 2
    )
    
  • a := 1,只能在函数内部使用
  • 常量

    const (
      C0 = iota
      C1
      C2
    )
    fmt.Println(C0, C1, C2) // 0 1 2
    

    iota 第一次出现的时候值是 0

    语法糖:如果每句话都差不多,可以省略

    const (
      C0 = iota
      C1 = iota
      C2 = iota
    )
    // 等价于
    const (
      C0 = iota
      C1
      C2
    )
    

    iota

  • iota 默认是 0,每行加 1
  • 只能在 const() 中使用
  • 字符串

  • string 是值类型,默认的初始值是空字符串,不是 nil
  • string 是只读的 byte slicelen 函数返回的是它所包含的 byte 数,这个 byte 和字符是不一样的
  • stringbyte 数组可以存放任何数据
  • s := "\xE4\xB8\xA5"
    fmt.Println(s) // 严
    fmt.Println(len(s)) // 3
    

    Unicode 和 UTF-8

    字符 “中”
    Unicode 0x4E2D
    UTF-8 0xE4B8AD
    string/[]byte [0xE4, 0xB8, 0xAD]

    rune 可以获取字符的 Unicode

    s := "中"
    fmt.Println(len(s)) // 3
    c := []rune(s)
    fmt.Println(len(c)) // 1
    fmt.Printf("中 Unicode:%x", c) // 4e2d
    fmt.Printf("中 UTF-8:%x", s) // e4b8ad
    

    高效拼接字符串 —— strings.Builder

    var builder strings.Builder
    for i := 0; i < 10; i++ {
      builder.WriteString(strconv.Itoa(i))
    }
    str := builder.String()
    

    高效拼接字符串 —— bytes.Buffer

    var buf bytes.Buffer
    for i := 0; i < 10; i++ {
      buf.WriteString(strconv.Itoa(i))
    }
    str := buf.String()
    

    数据类型

  • bool
  • string
  • intint8int16int32int64
  • uintuint8uint16uint32uint64uinttptr
  • byte:alias for uint8
  • rune:alias for int32, represents a Unicode code point
  • float32float64
  • complex64complex128
  • 类型转换

  • 不允许隐式类型转换
  • 别名和原有类型也不能进行隐式类型转换
  • type MyInt int64
    func TestImplicit(t *testing.T){
      var a int32 = 1
      var b int64
      var c MyInt
      b = a // 报错
      b = int64(a)
      c = b // 报错
      c = MyInt(b)
    }
    

    位运算

    &^ 按位清零

  • 1 &^ 0 -> 1
  • 1 &^ 1 -> 0
  • 0 &^ 1 -> 0
  • 0 &^ 0 -> 0
  • 如果后面一位是 1 输出为 1;如果后面一位是 0 前面一位是啥,输入就是啥

    const (
    Readable = 1

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论