Skip to content

Files

Latest commit

Sep 20, 2022
7cd8fcf · Sep 20, 2022

History

History

lesson2

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Nov 4, 2021
Oct 24, 2021
Sep 20, 2022
Nov 4, 2021
Nov 4, 2021
Nov 21, 2021
Dec 10, 2021
Sep 20, 2022

基础数据类型

数字

  • 整数:int, uint8, uint16, uint32, uint64, int8, int16, int32, int64

  • 浮点数:float32, float64

  • 复数:

    • complex64:实部和虚部都是float32类型的值

      var v complex64 = 1 + 0.5i
    • complex128:实部和虚部都是float64类型的值

      var v complex128 = 1 + 0.5i
    • 注意:虚部为1的情况,1不能省略,否则编译报错

      var v complex64 = 1 + i // compile error: undefined i
      var v complex64 = 1 + 1i // correct

字符串:string

  • len(str)函数可以获取字符串长度

    package main
    
    import "fmt"
    
    func main() {
        str := "abcdgfg"
        fmt.Println(len(str)) // 7
    }
  • 注意:string是immutable的,不能在初始化string变量后,修改string里的值,除非对string变量重新赋值

    package main
    
    import "fmt"
    
    func main() {
        str := "abc"
        str = "def" // ok
        /* 下面的就不行,编译报错:cannot assign to str[0] (strings are immutable)
        str[0] = "d"
        */
        fmt.Println(str)
    }
  • 字符串里字符的访问可以通过str[index]下标索引或者range迭代的方式进行访问

    package main
    
    import "fmt"
    
    func main() {
        str := "abc"
        /*下标访问*/
        size := len(str)
        for i:=0; i<size; i++ {
            fmt.Printf("%d ", str[i])
        }
        fmt.Println()
        
        /*range迭代访问*/
        for _, value := range str {
            fmt.Printf("%d ", value)
        }
        fmt.Println()
    }
  • 不能对string里的某个字符取地址:如果s[i]是字符串s里的第i个字符,那&s[i]这种方式是非法的

    // string3.go
    package main
    
    import "fmt"
    
    func main() {
    	str := "abc"
    	/*
    	the following code has compile error:
    	cannot take the address of str[0]
    	*/
    	fmt.Println(&str[0])
    }
  • string可以使用 : 来做字符串截取

    注意:这里和切片slice的截取有区别

    • 字符串截取后赋值给新变量,对新变量的修改不会影响原字符串的值
    • 切片截取后复制给新变量,对新变量的修改会影响原切片的值
    // string4.go
    package main
    
    import "fmt"
    
    func strTest() {
    	s := "abc"
    	fmt.Println(len(s)) // 3
    	s1 := s[:]
    	s2 := s[:1]
    	s3 := s[0:]
    	s4 := s[0:2]
    	fmt.Println(s, s1, s2, s3, s4) // abc abc a abc ab
    }
    
    func main() {
    	strTest()
    }
  • string可以用+做字符串拼接

    // string5.go
    package main
    
    import "fmt"
    
    func main() {
    	a := "ch"
    	b := "ina"
    	c := a + b
    	fmt.Println(c) // china
    }
  • string的更多用法可以参考:https://yourbasic.org/golang/string-functions-reference-cheat-sheet/

bool

值只能为truefalse

其它数字类型

  • byte:等价于uint8,数据范围0-255,定义的时候超过这个范围会编译报错

  • rune:等价于int32,数据范围-2147483648-2147483647

    • 字符串里的每一个字符的类型就是rune类型,或者说int32类型
  • uint:在32位机器上等价于uint32,在64位机器上等价于uint64

  • uintptr: 无符号整数,是内存地址的十进制整数表示形式,应用代码一般用不到(https://stackoverflow.com/questions/59042646/whats-the-difference-between-uint-and-uintptr-in-golang)

  • reflect包的TypeOf函数或者fmt.Printf%T可以用来获取变量的类型

    var b byte = 10
    var c = 'a'
    fmt.Println(reflect.TypeOf(b)) // uint8
    fmt.Println(reflect.TypeOf(c)) // int32
    fmt.Printf("%T\n", c) // int32

References