В последнее время мне захотелось заняться back-end разработкой, поэтому я обратил свое внимание на golang, которым пользуется компания. Go удобнее использовать как микросервис, возможно, из-за мощного синтаксиса golang, который меня очень привлек.
Приходите и дайте нам почувствовать кокетливый стиль кода Go.
1. Объявление дьявольской переменной
2, объявление массива
Массив — это массив, и он определяется следующим образом:
var arr [n]type
В [n]type n представляет длину массива, а type представляет тип элемента хранилища. Операции над массивами аналогичны другим языкам, и все они читаются или присваиваются через []:
var arr [10]int // 声明了一个int类型的数组
arr[0] = 42 // 数组下标是从0开始的
arr[1] = 13 // 赋值操作
fmt.Printf("The first element is %d\n", arr[0]) // 获取数据,返回42
fmt.Printf("The last element is %d\n", arr[9]) //返回未赋值的最后一个元素,默认返回0
Поскольку длина также является частью типа массива, [3]int и [4]int являются разными типами, и массив не может изменить длину. Присваивание между массивами — это присваивание значений, то есть когда массив передается в качестве параметра функции, он фактически является копией массива, а не его указателем. Если вы хотите использовать указатели, вам нужно использовать тип среза, описанный ниже.
Массивы могут быть объявлены с помощью другого :=
a := [3]int{1, 2, 3} // 声明了一个长度为3的int数组
b := [10]int{1, 2, 3} // 声明了一个长度为10的int数组,其中前三个元素初始化为1、2、3,其它默认为0
c := [...]int{4, 5, 6} // 可以省略长度而采用`...`的方式,Go会自动根据元素个数来计算长度
3. Мощная операция среза на языке го
Срезы в golang очень мощные, что делает операции с массивами очень удобными и эффективными. В процессе разработки все массивы, представленные неопределенной длиной, являются срезами. Однако многие студенты имеют смутное представление о slice, что заставляет их думать, что массив в golang — это ссылочный тип, в результате чего в реальной разработке встречается много ям, в результате чего возникают какие-то необъяснимые проблемы, и данные в массиве потерян.sliceструктура данных, это просто, указатель на реальныйarrayуказатель на адресptr,sliceдлинаlenи емкостьcap.
где len и cap — значения, возвращаемые нашими вызовами len(slice) и cap(slice).
Давайте разберем ptr, len, cap в соответствии с определением структуры данных slice
// В соответствии с определенной выше структурой данных
type Slice struct {
ptr unsafe.Pointer // Array pointer
len int // slice length
cap int // slice capacity
образец кода
4. Декларация карты
УведомлениеПоскольку язык go является строго типизированным языком, хэш-карта также является типизированной, что воплощается в том, что и ключ, и значение должны указывать тип, например, объявление ключа в виде строки и значения в виде карты строк. нужно сделать
enum на языке го
5, для обхода петли
func formapTest() {
var arrayi= [...] int{1, 2, 3, 4, 5, 6, 7, 78, 9, 10}
for index, c := range arrayi {
fmt.Printf("array[%d] = %d", index, c)
}
str := "go语言的学习和啪啪"
for i, ch := range str {
fmt.Println(i, ch) //ch的类型为rune unicode编码
}
//输出为:28907 (Unicode编码时,两个字节代表一个字符)
n := len(str)
for i := 0; i < n; i++ {
ch := str[i] // 依据下标取字符串中的字符,类型为byte
fmt.Println(i, ch)
//输出为utf-8编码,一个汉字字符占三个字节
}
array := []rune(str)
n = len(array)
for i := 0; i < n; i++ {
ch := array[i] // 依据下标取字符串中的字符,类型为byte
fmt.Println(i, ch) //unicode 编码转十进制输出
//golang中字符类型的实际数据类型为uint32,以for循环遍历的方式输出结果都是Unicode编码的
}
//var str string= "yyh,hello,卡卡论坛,好厉害哦"
//fmt.Print(str)
fmt.Print("\n================================\n")
for i , ch := range str{
//fmt.Printf("(%d, %c)",i,ch)
fmt.Printf("(%d, %x)",i,ch)
}
fmt.Print(utf8.RuneCountInString(str))
fmt.Print("================================\n")
bytes := [] byte(str)
//for len(bytes) > 0 {
r, size := utf8.DecodeRune(bytes)
fmt.Printf("%c %d",r,size)
//}
fmt.Println()
fmt.Println()
fmt.Println()
for i,c := range bytes{
r,_ :=utf8.DecodeRune(bytes)
fmt.Printf("%d %c %x \n",i,r,c)
}
for i ,ch := range []rune(str){
fmt.Printf("%d: %c ",i,ch)
}
str2 := "123 我按时 的发ad fg票 是否 adfg 发 发生a f发 的sj df"
sps := strings.Split(str2," ")
sps = strings.Fields(str2)
var isContact = strings.Contains(str2,"你们")
fmt.Println(sps)
fmt.Println(isContact)
}
6. Структура и наследование в golang
7. Интерфейсы в голанге
8. Пустой интерфейс в golang
Подобно объекту в java, пустой интерфейс (interface{}) не содержит никаких методов, поэтому все типы реализуют пустой интерфейс. пустой интерфейс для Описание ничего не делает (поскольку оно не содержит никаких методов), но пустой интерфейс полезен, когда нам нужно сохранить значение любого типа, потому что он может хранить значение любого типа. Он чем-то похож на тип void* языка C.
Функция принимает интерфейс{} в качестве параметра, затем она может принимать любой тип значения в качестве параметра, если функция возвращает интерфейс{}, то также Вы можете вернуть любой тип значения. Разве это не очень полезно!
9. Поля можно определять в структурах, но не в интерфейсах
структуры не могут иметь тот же API, что и интерфейсы, поскольку интерфейсы не могут определять поля. Это не большая проблема, потому что в интерфейсе можно определить методы получения и установки, хотя это немного сбивает с толку. например:
10. Публичное и частное именование
Golang продвигает схему именования общедоступных и частных методов Python на шаг вперед. Когда я впервые узнал, что функции и структуры, начинающиеся с заглавной буквы, являются общедоступными, а те, которые начинаются со строчной буквы, являются приватными, это было странно, но мне понравился синтаксис.
type PublicStructName struct {} //public 外部能调用
type privateStructName struct {} // 私有 结构体,仅内部函数能调用
Наконец
Я здесь первый сегодня, грамматик golang много, и это только верхушка айсберга. Если вы хотите изучить golang, я рекомендую это здесь:GitHub.com/UN, может быть, я/он и…
читать далее
31 вопрос для Android-интервью, которые укрепят ваш фундамент!
Вы выбираете Java, Go или PHP для серверной части?
AndroidUtils: утилиты, которые необходимо собрать при разработке Android.
Вопросы интервью Meituan: подробное объяснение пула потоков Java ThreadPool
Верь в себя, нет ничего невозможного, только неожиданное
Здесь вы найдете не только технологии!