- 如果我们需要声明不同类型的变量 那么可以按照以下语法声明
var (
name1 = initialvalue1
name2 = initialvalue2
)
https://ytb.dscsdoj.top/
- :=语法至少要有一个新的变量
package main
import "fmt"
func main() {
a, b := 20, 30 // declare variables a and b
fmt.Println("a is", a, "b is", b)
b, c := 40, 50 // b is already declared but c is new
fmt.Println("b is", b, "c is", c)
b, c = 80, 90 // assign new values to already declared variables b and c
fmt.Println("changed b is", b, "c is", c)
}
如果声明的变量都不是新的 就会报错
printf println的区别
https://blog.csdn.net/zgh0711/article/details/78843361
需要格式化输出 使用printf 需要输出字符串 变量 就用println
使用格式化输出占位符 %T 输出变量类型
unsafe.sizeOf输出变量内存浮点数 整数 声明不带位数的话,默认表示为系统位数
如果你的系统为32位,那么float int 默认为float32 int32
64位相同int 代表整数 包括正整数 以及负整数 uint 代表正整数
浮点数相加相减问题
原因可看此处https://blog.csdn.net/u010897392/article/details/37878155通过T()来强转类型 强转类型必须显性声明类型
package main
import "fmt"
func main() {
i := 53
var j float64 = float64(i)
var k string = string(i)
fmt.Println(j, k+"324234")
}
- 常量必须在编译时已知 不可以被声明为函数 因为函数会在运行时被调用
package main
import (
"fmt"
"math"
)
func main() {
fmt.Println("Hello, playground")
var a = math.Sqrt(4)//allowed
const b = math.Sqrt(4)//not allowed
}
- 单个字符串是一个无类型常量(。。并没有太看懂有什么用意。。。)
const hello = "Hello World"
无类型常量 “hello world” 分配给了 常量 hello 那么这个常量 还是无类型的
虽然是无类型常量 但是如果使用%T(hello) 那么将输出string 因为无类型常量将在需要时提供一个关联的默认类型 string
- 命名返回值
area and perimeter are the named return values in the above function. Note that the return statement in the function does not explicitly return any value. Since area and perimeter are specified in the function declaration as return values, they are automatically returned from the function when a return statement in encountered.
area 和 perimeter 在上面这个函数中都是被命名的返回值。注意这个函数中返回语句并没有指定任何返回值。从area和perimeter被指定为命名返回值时,函数就会返回他们,并且会在函数调用reutrn时自动返回
ps. 这个特性的用意应该是让人更清晰的理解返回值是什么 直接命名返回值的做法比在代码中寻找返回值的变量名来理解更加清晰 当然这应该是注释的功能之一
// 用意应该是注释的这个功能
/**
* @return { int } area
* @return { int } perimeter
*/
func rectProps(length int, width int) (area int, perimeter int) { // 直观的理解返回值的意义
area = length * width // 无需声明变量
perimeter = (length + width) * 2
return // 无需显式返回
}
- 空白标识符 _
当有多个返回值时, 可以用_来抛弃无用的变量
area3, _ := rectProps(7, 2)
fmt.Println("area %f", area3)
go在windows下的环境变量配置
go install以及go build命令需要配置好GOBIN以及GOPATH两个环境变量 否则将会报错 找不到GOBIN变量可以声明在if语句中
if num := 10; num % 2 == 0 { //checks if number is even
fmt.Println(num,"is even")
} else {1. 如果我们需要声明不同类型的变量 那么可以按照以下语法声明
``` GO
var (
name1 = initialvalue1
name2 = initialvalue2
)
https://ytb.dscsdoj.top/
- :=语法至少要有一个新的变量
package main
import "fmt"
func main() {
a, b := 20, 30 // declare variables a and b
fmt.Println("a is", a, "b is", b)
b, c := 40, 50 // b is already declared but c is new
fmt.Println("b is", b, "c is", c)
b, c = 80, 90 // assign new values to already declared variables b and c
fmt.Println("changed b is", b, "c is", c)
}
如果声明的变量都不是新的 就会报错
printf println的区别
https://blog.csdn.net/zgh0711/article/details/78843361
需要格式化输出 使用printf 需要输出字符串 变量 就用println
使用格式化输出占位符 %T 输出变量类型
unsafe.sizeOf输出变量内存浮点数 整数 声明不带位数的话,默认表示为系统位数
如果你的系统为32位,那么float int 默认为float32 int32
64位相同int 代表整数 包括正整数 以及负整数 uint 代表正整数
浮点数相加相减问题
原因可看此处https://blog.csdn.net/u010897392/article/details/37878155通过T()来强转类型 强转类型必须显性声明类型
package main
import "fmt"
func main() {
i := 53
var j float64 = float64(i)
var k string = string(i)
fmt.Println(j, k+"324234")
}
- 常量必须在编译时已知 不可以被声明为函数 因为函数会在运行时被调用
package main
import (
"fmt"
"math"
)
func main() {
fmt.Println("Hello, playground")
var a = math.Sqrt(4)//allowed
const b = math.Sqrt(4)//not allowed
}
- 单个字符串是一个无类型常量(。。并没有太看懂有什么用意。。。)
const hello = "Hello World"
无类型常量 “hello world” 分配给了 常量 hello 那么这个常量 还是无类型的
虽然是无类型常量 但是如果使用%T(hello) 那么将输出string 因为无类型常量将在需要时提供一个关联的默认类型 string
- 命名返回值
area and perimeter are the named return values in the above function. Note that the return statement in the function does not explicitly return any value. Since area and perimeter are specified in the function declaration as return values, they are automatically returned from the function when a return statement in encountered.
area 和 perimeter 在上面这个函数中都是被命名的返回值。注意这个函数中返回语句并没有指定任何返回值。从area和perimeter被指定为命名返回值时,函数就会返回他们,并且会在函数调用reutrn时自动返回
ps. 这个特性的用意应该是让人更清晰的理解返回值是什么 直接命名返回值的做法比在代码中寻找返回值的变量名来理解更加清晰 当然这应该是注释的功能之一
// 用意应该是注释的这个功能
/**
* @return { int } area
* @return { int } perimeter
*/
func rectProps(length int, width int) (area int, perimeter int) { // 直观的理解返回值的意义
area = length * width // 无需声明变量
perimeter = (length + width) * 2
return // 无需显式返回
}
- 空白标识符 _
当有多个返回值时, 可以用_来抛弃无用的变量
area3, _ := rectProps(7, 2)
fmt.Println("area %f", area3)
go在windows下的环境变量配置
go install以及go build命令需要配置好GOBIN以及GOPATH两个环境变量 否则将会报错 找不到GOBIN变量可以声明在if语句中
if num := 10; num % 2 == 0 { //checks if number is even
fmt.Println(num,"is even")
} else {
fmt.Println(num,"is odd")
}
fmt.Printf("num = %f", num) // error!
但是作用域尽在if语句中
好奇怪的写法
- else 语句必须在if语句结束的花括弧同一行, 如果在下一行 就会报错
if num := 10; num % 2 == 0 { //checks if number is even
fmt.Println(num,"is even")
}
else {
fmt.Println(num,"is odd")
} // not work!
这是因为GO会自动添加分号
- GO只有for循环
- break用来停止循环 continue用来跳过本次代码块的执行
- break label 用于跳出循环。
- for循环的3个组成部分都是可选的
18.fallthrough 语句将会让switch语句中成功执行的case转移到下一个case 语句
19 go中的数组拷贝都是浅拷贝 也就是说改变拷贝的值不影响原值 将数组作为参数也是一样
fmt.Println(num,"is odd")
}
fmt.Printf("num = %f", num) // error!
但是作用域尽在if语句中
好奇怪的写法
- else 语句必须在if语句结束的花括弧同一行, 如果在下一行 就会报错
if num := 10; num % 2 == 0 { //checks if number is even
fmt.Println(num,"is even")
}
else {
fmt.Println(num,"is odd")
} // not work!
这是因为GO会自动添加分号
- GO只有for循环
- break用来停止循环 continue用来跳过本次代码块的执行
- break label 用于跳出循环。
- for循环的3个组成部分都是可选的
18.fallthrough 语句将会让switch语句中成功执行的case转移到下一个case 语句 - GO中的数组都是浅拷贝 也就是说改变拷贝的值不影响原值
package main
import (
"fmt"
)
func main () {
nums := [3]int{5, 7, 2}
nums1 := nums
nums1[0] = 7
fmt.Println(nums) // [5, 7, 2] // 修改拷贝的值不影响原值
fmt.Println(nums1) // [7, 7, 2]
}
- GO中的slice属于引用,改变slice将会影响原来的Array 并且可能影响其他的slice
nums2 = nums[0:2] // 请注意 slice是[start : end] start是下标 end是index - 1
fmt.Println(nums2) // [5, 7]
nums2[1] = 3
fmt.Println(nums2) // [5, 3]
fmt.Println(nums) // [5, 3, 2]
- GO中的slice拥有数量和容量的概念
数量指的是slice的节点数量
容量值得是slice所引用数组的下标数
fruitArray := [...]string{"23213", "dsfdsf", "dsfrwg", "fregreg", "rgtrjrrhtr"}
fruitSlice := fruitArray[1, 5]
fmt.Println(fruitSlice) // ["dsfdsf", "dsfrwg", "fregreg", "rgtrjrrhtr"]
fmt.Println(len(fruitSlice), cap(fruitSlice)) // 4, 4
slice append 插入原来的切片将返回一个新的数组以及新的切片
对于一个容量和数量都为0的切片,被称为
nil
nil可以使用append函数来填充内容
var names []string // 声明
if names == nill {
names = append(names, "chen yu", "scscs", "cssss")
}
fmt.Println(names, len(names), cap(names)) // ["chen yu" "scscs" "cssss"] 3, 3
- 对于多个切片,你可以用append结合
...
操作符来合并多个切片
veggies := []string{"potatoes", "tomatoes", "brinjal"}
fruits := []string{"oranges", "apples"}
food := append(veggies, fruits...)
fmt.Println(food) // [potatoes tomatoes brinjal oranges apples]
- slice和array的区别
numbers := [5]int // 数组
numbers1 := []int // 切片
不指定数量的是切片
切片是引用传递
数组是副本
函数传参数组是副本传递
函数传参切片是引用传递
- 变量参数 对于 切片参数的优势
- 理解可变参数以及切片 引用和拷贝的区别
package main
import (
"fmt"
)
func change(s ...string) {
s[0] = "Go"
s = append(s, "playground")
fmt.Println(s)
}
func main() {
welcome := []string{"hello", "world"}
change(welcome...)
fmt.Println(welcome)
}
上面的操作中,welcome最终结果是[GO world] 原因是 append函数将会创建一个新的splice 以及其引用的array append函数会拷贝原变量 而不是引用它 而slice参数传递是引用传递 所以改变s参数下标的值 会改变传入的welcome变量
- Map类型 如果获取的key不存在,那么value会返回0
amap := map[string]int {
"qwd": 1
"fd": 45
"grg": 466
}
fmt.Println(amap['ffdfff']) // 0
- 如果不确定key是否存在与map
map[key]会返回两个参数
value, ok := map[key]
fmt.Println(value, ok) // 0 false
map和slice一样 也是引用类型
除非map是nil 否则不可以做比较操作
==
指针的类型声明是*T 比如
a := *int
&操作符用来获取内存地址
b := 255
a = &b
fmt.Println(a) // 0xc000012090
- interface是一组函数签名
type MyInterface interface{
Print()
} // 定义一个拥有Print函数的interface
func TestFunc(x MyInterface) {}// TestFunc的参数必须是MyInterface类型的 也就是必须拥有Print函数的对象
type MyStruct struct {} // 声明一个数据结构
func (me MyStruct) Print() {} // 声明一个基于MyStruct结构的Print函数
func main() {
var me MyStruct // 初始化一个MyStruct类型的变量
TestFunc(me) // 将这个变量传参进去,由于MyStruct类型拥有Print函数 所以这段代码正确执行
}
``'
34.函数传参都是拷贝传参 除了splice map channel是指针传递 可以用指针来进行值传参
'''
package main
import "fmt"
//简单的一个函数,实现了参数+1的操作
func add1(a int) int {
a = a+1 // 我们改变了a的值
return a //返回一个新值
}
func main() {
x := 3
fmt.Println("x = ", x) // 应该输出 "x = 3"
x1 := add1(x) //调用add1(x)
fmt.Println("x+1 = ", x1) // 应该输出"x+1 = 4"
fmt.Println("x = ", x) // 应该输出"x = 3"
}
'''