Index ¦ Archives ¦ Categories ¦ Tags

go 学习笔记(1)

  • 每个go源码文件开头都是一个package声明,表示该go代码所属的包。要生成go可执行程序,必须建立一个名字为main的包,并且在该包中包含一个main()函数(该函数是go可执行程序的起点)

  • 如果两个go源码文件的package声明是一样的,则可以互相调用各源码文件定义的函数:

//bubblesort.go
package bubblesort
func BubbleSort(value []int) {
    ...
    //具体函数实现
    ...
}
//bubblesort_test.go
package bubblesort

import "testing"

fun TestBubbleSort(t *testing.T) {
  values := []int{5, 4, 3, 2, 1}
  BubbleSort(values)  // package声明都为bubblesort,所以这样可以直接调用BubbleSort函数
      ...
}
  • 以大写字母开头的常量在包外可见!
  • 枚举
const (
  Sunday = itoa
  Monday
  Tuesday
  ...
  numberOfDays // 这个常量没有导出
)

Question: bool类型可以 b := true吗?(可以)

  • 取反 C语言: ~x ; Go语言: ^x
  • fvalue := 12.0 会被直接设为float64
  • 不能用==来判断浮点数是否相等,结果并不精确,推荐的替代方案:
import "math"
//p为用户自定义的比较精度,比如0.00001
func IsEqual(f1, f2, p float64) bool {
    return math.Fdim(f1, f2) < p
}
  • 首字母大写的变量才能在包外导入
  • fmt.Println()打印字符,字符串
str = 'Hello world'
fmt.Println('%s', str[0]) //‘H'
fmt.Println(str[0]) //72 根据下表取字符串,类型为byte
  • append(mySlice1, mySlice2…)后面要加三个省略号

  • 直接创建数组和数组切片,语法上的差别好像就是数组指定元素个数:myArray := [10] int {1,2,3}

  • 切片不指定元素个数 mySlice := []int{1, 2, 3} Quesiton:

array := [...]float64{7.0, 8.5, 9.1}
x := Sum(&array)  // Note the explicit address-of operator
  • 初始化slice
mySlice := make([]int, 5, 10) //初始5个元素,元素初始值为0,并预留10个元素
  • map查找
value, ok := myMap["1234"]
             if ok {//查到了
             } else { 没找到
               }
  • 为类型添加方法
package main
import "fmt"
type Integer int
// 这里是只传递,不会改变值大小
func (a Integer) Less(b Integer) bool {
      return a < b
}
// 这里是指针传递,值会改变
func (a *Integer) Add(b Integer) {
    *a += b
}
//调用
func main() {
    var a Integer = 1
    if a.Less(2) {
       fmt.Println(a, "less 2")
    }
    a.add(2)
        fmt.Println("a=", a)
}
  • 值传递和引用传递
var a = [3]int{1, 2, 3}
var b = &a
b[1]++
fmt.Println(a, *b)
//运行结果 [1 3 3] [1 3 3]

变量b的类型不是[3]int,而是*[3]int类型

© Tian Li. Built using Pelican. Theme by Giulio Fidente on github. .