//多变量申明var a, b, c int//多变量赋值var a, b, c = 1, 2, 3//变量交换
a, b = b, a
//[]访问符
medals := []string{"gold", "silver", "bronze"}
//或者一个一个var medals [3]string
medals[0] = "gold"//字符串
s := "hello, world"
fmt.Println(len(s))// "12"
fmt.Println(s[0], s[7]) // "104 119" ('h' and 'w')
fmt.Println(s[:5]) // "hello"
fmt.Println(s[7:]) // "world"
fmt.Println(s[:]) // "hello, world"
和C很像的地方
//定义类型//type TypeName goType//Typename(T) 表示类型转换,只有当两个类型的底层基础类型相同才能转换type Password stringtype Celsius float64var c Celsius
println(c == 0)
println(c == Celsius(0))
//指针的概念
x := 1
p := &x
fmt.Println(*p) //1
*p = 2
fmt.Println(p) //0xc42001c098
fmt.Println(x) //2
fmt.Println(*p == x) //true//命令行参数//-n : 忽略行尾的换行符;//-s : 指定分隔符//-help : 查看参数//./main -s , q w e r => q,w,e,rvar n = flag.Bool("n", false, "omit trailing newline")
var sep = flag.String("s", " ", "separator")
func main(){
flag.Parse()
fmt.Print(strings.Join(flag.Args(), *sep))
if !*n {
fmt.Println()
}
}
golang的内置函数
//func new(Type) *Type//返回一个对应类型的指针
p := new(int)
垃圾回收
var global *intfunc f() {
var x int
x = 1
global = &x
//这个变量虽然是局部变量,但是它的指针逃逸出了作用域//所以这个变量会在堆上分配
}
func g() {
y := new(int)
*y = 1//这个变量没有逃逸出去,也可以在栈上分配
}
循环
golang只有for循环,而没有了while
func gcd(x, y int) int {
for y != 0 {
x, y = y, x%y
}
return x
}
func fib(n int) int {
x, y := 0, 1for i := 0; i < n; i++ {
x, y = y, x+y
}
return x
}
//range关键字可以简化很多func main() {
var str = []string{"1", "2", "3"}
for s := range str{
println(s)
}
}
面向对象?
type Celsius float64//表示类型能调用的方法,在方法名前面加(t T)func (c Celsius) String() string {
return fmt.Sprintf("%g。C", c)
}
func main() {
var c = Celsius(100)
println(c.String())
}
golang包
可以使用init初始化函数来简化初始化工作
该函数不能被调用或引用
var pc [5]bytefunc init() {
for i := range pc {
pc[i] = pc[i/2] + byte(i&1)
}
}
func main() {
for s, i := range pc{
print(s)//s是索引print("->")
print(i)//i是对应的值print("\n")
}
}
/*
0->0
1->1
2->1
3->2
4->1
*///另一种方法,使用匿名函数var pc [256]byte = func() (pc [256]byte) {
for i := range pc {
pc[i] = pc[i/2] + byte(i&1)
}
return
}()
UTF8
import (
"fmt""unicode/utf8"
)
func main() {
s := "Hello, 世界"
fmt.Println(len(s))
fmt.Println(utf8.RuneCountInString(s))
for i, r := range"Hello, 世界" {
fmt.Printf("%d\t%q\t%d\n", i, r, r)
}
}
字节类型
strings包
func Contains(s, substr string) bool
func Count(s, sep string) int
func Fields(s string) []string
func HasPrefix(s, prefix string) bool
func Index(s, sep string) int
func Join(a []string, sep string) string
bytes包
func Contains(b, subslice []byte) bool
func Count(s, sep []byte) int
func Fields(s []byte) [][]byte
func HasPrefix(s, prefix []byte) bool
func Index(s, sep []byte) int
func Join(s [][]byte, sep []byte) []byte
func main() {
s := "abc"
b := []byte(s)
s2 := string(b)
println(s2)
}
func intsToString(values []int) string {
var buf bytes.Buffer
buf.WriteByte('[')
for i, v := range values {
if i > 0 {
buf.WriteString(", ")
}
fmt.Fprintf(&buf, "%d", v)
}
buf.WriteByte(']')
return buf.String()
}
func main() {
fmt.Println(intsToString([]int{1, 2, 3})) // "[1, 2, 3]"
}